簡體   English   中英

Laravel雄辯地加入幾個表

[英]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關系,在這種情況下,為兩個表創建兩個模型,即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);

這將返回ID為1的產品以及集合中所有相關類別,因此您可以使用$product->categories->first()->name ,也可以對以下類別進行循環:

foreach($product->categories as $cat) {
    echo $cat->name;
}

你也可以使用join不需要的關系的方法和你可以使用同樣的方法加入了在使用的模型Fluent (檢查其他答案)。 但是,無論哪種方式,您都需要將categoryproduct映射存儲在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM