[英]Laravel Eloquent join several tables
我有3張桌子:
products
|id|name|about|
=categories=
|id|name|parent|
=products-categories=
|id|product_id|cat_id|
我需要一個產品類別名稱。 我有一個SQL查詢:
SELECT s.name FROM products AS p
LEFT JOIN `products-categories` AS cats ON p.id = cats.product_id
LEFT JOIN `categories` AS s ON cats.cat_id = s.id
WHERE product_id = 1;
而且有效! 但是我如何在Laravel Eloquent的幫助下做到這一點(不流利!)
您可以使用Eloquent
關系,在這種情況下,為兩個表創建兩個模型,即product
和Category
:
class Category extends Eloquent {
protected $table = 'categories'; // optional
public function products()
{
return $this->belongsToMany('Product', 'products_categories', 'category_id', 'product_id');
}
}
class Product extends Eloquent {
protected $table = 'products'; // optional
public function categories()
{
return $this->belongsToMany('Category', 'products_categories', 'product_id', 'category_id');
}
}
現在,您可以使用這些關系方法來獲取相關數據,例如:
$product = Product::with('categories')->find(1);
這將返回ID為1
的產品以及集合中所有相關類別,因此您可以使用$product->categories->first()->name
,也可以對以下類別進行循環:
foreach($product->categories as $cat) {
echo $cat->name;
}
你也可以使用join
不需要的關系的方法和你可以使用同樣的方法加入了在使用的模型Fluent
(檢查其他答案)。 但是,無論哪種方式,您都需要將category
和product
映射存儲在products_categories
表中。 在Laravel
網站上了解有關many-to-many
關系的Laravel
信息 。
只需使用leftJoin
方法。 它在Eloquent中的工作原理與在Query Builder中相同。
$product = Product::leftJoin('product-categories', 'product-categories.product_id', '=', 'products.id')
->leftJoin('categories', 'categories.id', '=', 'product-categories.cat_id')
->where('product_id', 1)
->first(['categories.name']);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.