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
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With