我在联接三个表并恢复原始表值时遇到问题。
我有一个父表,该表是一家商店,需要查找该商店内产品的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
,我想让它返回所有原始表的存储,然后返回当前存储并为所有存储重复该操作。
有意义的希望 任何帮助都会很棒。
答案 0 :(得分:0)
我认为您的关系是这样的:
Stores -> (n*n)StoreProducts -> Products -> (n*1)Brands
其中StoreProducts
是Stores
和Products
之间的联接表。在这种假设下,我将使用以下内容:
在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);
});
这将为您提供品牌存在的商店。