Laravel Left连接多个表并返回原始表值

时间:2018-11-26 13:28:50

标签: laravel eloquent

我在联接三个表并恢复原始表值时遇到问题。

我有一个父表,该表是一家商店,需要查找该商店​​内产品的brand_id。我无法直接访问brand_id,因此我需要加入,我必须加入商店产品列表,然后再将其加入包含brand_id的产品表中。

$this_return = Store::with('address','setting')
                    ->leftjoin('StoreProducts', function ($join){
                        $join->on('StoreProducts.store_id', '=', 'stores.id');
                    })->leftjoin('products', function ($join) {
                        $join->on('products.id','=','StoreProducts.product_id');
                })
                ->where('products.brand_id', '=', $brandID)
                ->isActive()
                ->get();

这将返回一个产品值,但是如果products.brand_id等于$brandID,我想让它返回所有原始表的存储,然后返回当前存储并为所有存储重复该操作。

有意义的希望 任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

我认为您的关系是这样的:

Stores -> (n*n)StoreProducts -> Products -> (n*1)Brands

其中StoreProductsStoresProducts之间的联接表。在这种假设下,我将使用以下内容:

Store模型中,

public function products(){
    return $this->belongsToMany(\App\Product::class, "store_products"); 
}

Products模型中,

public function stores(){
    return $this->belongsToMany(\App\Store::class, "store_products");
}

StoreProducts模型中,

public function store(){
    return $this->belongsTo(\App\Store::class);
}

public function product(){
    return $this->belongsTo(\App\Product::class);
}

通过这种方式创建关系。然后,您可以使用以下内容:

$stores = \App\Store::whereHas("products", function($q) use ($brandId){
    return $q->where("brand_id", $brandId);
});

这将为您提供品牌存在的商店。