Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel Eloquent and Multiple Joins

I understand how to use Eloquent for basic queries and relationships, but I start getting confused when selecting information based on relationships in multiple tables.

For example, i can get the data I need from the database using the the query builder as follows:

    $data['products'] = DB::table('product')
    ->select('product.id', 'product.ref_num', 'productdetails.name')
    ->join('productdetails', function($join)
    {
        $join->on('product.id', '=', 'productdetails.product_id')
             ->where('productdetails.website_id', '=', '7');
    })
    ->leftJoin('product_category', function($join) use($submenu_id){
        $join->on('product.id', '=', 'product_category.product_id')
            ->where('product_category.category_id', '=', $submenu_id);
    })
    ->leftJoin('product_type', function($join) use($type_id){
        $join->on('product.id', '=', 'product_type.product_id')
            ->where('product_type.type_id', '=', $type_id);
    })
    ->get();

Basically, i'm getting data from the product and productdetails tables based on which category the product is part of and what type of product it is; These are defined by inner joins to pivot tables product_type and product_category.

Now assuming i have the eloquent relationships set up correctly, how would i go about doing this in Eloquent?

Here are the relevant parts of the Eloquent Models

Product

class Product extends Eloquent{

public function productdetails()
{
    return $this->hasMany('Productdetail');

public function categories()
{
    return $this->belongsToMany('Category', 'product_category', 'product_id', 'category_id');
}

public function types()
{
    return $this->belongsToMany('Producttype', 'product_type', 'product_id', 'type_id');
}
}

Product Details

class Productdetail extends Eloquent
{


public function product()
{
    return $this->belongsTo('Product');
}
}

ProductType

class ProductTypes extends Eloquent{


function products()
{
    return $this->belongsToMany('products', 'product_id', 'type_id', 'product_id');
}

Category

class Category extends Eloquent{

public function products()
{
    return $this->belongsToMany('product', 'product_category', 'category_id', 'product_id');
}
}

Thanks in advance

like image 474
Rob Avatar asked Apr 03 '14 15:04

Rob


People also ask

Can we use join in eloquent laravel?

Eloquent power joinsAdd some Laravel magic to your Eloquent joins. If you have some experience using databases, it is very likely you have used joins at least once in your career. Joins can be used for a bunch of different reasons, from selecting data from other tables to limiting the matches of your query.

How do you join in eloquent?

laravel eloquent Join method by default use inner join. For example if you have 10 rows and you want the join from other table then it will only return the rows which satisfy both the tables. Laravel eloquent or query builder join method do the same as MySQL inner join function.


1 Answers

Assuming your relations are correct and related table names are: categories and types, this will do the job:

Product::with('productdetails')
    ->whereHas('categories', function ($query) use ($submenu_id) {
          $query->where('categories.id', '=', $submenu_id);
    })
    ->whereHas('types', function ($query) use ($type_id) {
          $query->where('types.id', $type_id); // side note: operator '=' is default, so can be ommited
    })
    ->get();

It will run 2 queries ( first for getting appropriate products, second for product details related to them) and return Eloquent Collection

like image 119
Jarek Tkaczyk Avatar answered Sep 28 '22 06:09

Jarek Tkaczyk