Laravel 5.1 - 通过数据透视表显示相关产品

时间:2015-11-07 16:56:54

标签: php laravel laravel-5 eloquent relationship

我被困在这条路上太长时间无法自己解决,所以这就是我的问题:

我的数据库是衣服填充的。我想根据颜色显示相关的衣服。

我的人际关系:

(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种颜色(红色和黑色)的产品时,我看到相关产品只有黑色或只有红色。但是当我观看只有黑色的产品时,不会显示多种颜色的相关项目。

3 个答案:

答案 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');
    }