我被困在这条路上太长时间无法自己解决,所以这就是我的问题:
我的数据库是衣服填充的。我想根据颜色显示相关的衣服。
我的人际关系:
(Product.php)
public function colors(){
return $this->belongsToMany('App\Color', 'colors_products', 'FK_product', 'FK_color');
}
(Color.php)
public function products(){
return $this->belongsToMany('App\Product', 'colors_products', 'FK_color', 'FK_product');
}
因此,每个product
都有多个colors
。我想在同一页面上显示相关的部分。因此,如果我正在看一块颜色为"红色"和"黑色",我想要显示标有"红色"的相关衣服。和/或"黑"。所以它不必是红色和黑色。
我怎样才能得到所有衣服(有时是多种颜色),就像我正在看的那件颜色?
更新
Product::with('colors')->whereIn('id', $arColors)->get();
是解决方案的一部分。当我有2种颜色(红色和黑色)的产品时,我看到相关产品只有黑色或只有红色。但是当我观看只有黑色的产品时,不会显示多种颜色的相关项目。
答案 0 :(得分:1)
NULL的答案很接近。我想你想使用whereHas()。鉴于您的颜色数组可以从您的活动产品中获得,我们可以说它叫做$ color_ids。
要加载与其中一种颜色匹配的所有其他产品,请尝试以下操作:
$related_products = Product::whereHas('colors', function($query) use ($color_ids) {
$query->whereIn('id', $color_ids);
})->get();
whereIn()在此处记录:http://laravel.com/docs/5.1/queries#where-clauses
whereHas()在此处记录:http://laravel.com/docs/5.1/eloquent-relationships#querying-relations
答案 1 :(得分:0)
试试这个,希望这会对你有帮助。
Color::with('products')->whereIn('color', ['red', 'black'])->get();
这将为您提供颜色和与之相关的所有产品。
<强>更新强> 根据您的更新,您可以试试这个。
Product::with(['color' => function($q) use ($colorArray) {
$q->whereIn('color', $colorArray); }])
->has('color')
->get();
我没有这样做,但希望能够工作。
答案 2 :(得分:0)
如果您想使用关系并且使用视图(或使用支持它的数据库),则可以创建如下视图:
create
view related_products
as
select distint
a.FK_product as FK_product,
b.FK_product as FK_related_product
from
colors_products as a
join colors_products as b
on (a.FK_color = b.FK_color and a.FK_product <> b.FK_product);
这应该加入所有至少有一种颜色的产品。
现在您可以为模型添加关系,如下所示:
public function relatedProducts()
{
return $this->belongstoMany('App\Product', 'related_products', 'FK_related_product');
}