我有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的帮助下做到这一点(不流利!)
答案 0 :(得分:1)
您可以使用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);
这将返回标识为1
的产品以及集合中的所有相关类别,以便您可以使用$product->categories->first()->name
,或者您可以对以下类别执行循环:
foreach($product->categories as $cat) {
echo $cat->name;
}
此外,您可以使用不需要关系方法的join
,并且您可以使用相同的方法加入Fluent
中使用的模型(检查其他答案)。但无论哪种方式,您都需要在category
表中存储product
和products_categories
映射。详细了解many-to-many
website上的Laravel
关系。
答案 1 :(得分:0)
只需使用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']);