Laravel Eloquent加入了几张桌子

时间:2014-08-23 09:21:12

标签: php laravel eloquent

我有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的帮助下做到这一点(不流利!)

2 个答案:

答案 0 :(得分:1)

您可以使用Eloquent关系,在这种情况下,为两个表创建两个模型,即productCategory

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表中存储productproducts_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']);