Laravel 5.5 - 如何获取多对多关系中的相关产品

时间:2018-01-22 08:50:07

标签: laravel laravel-5.5

enter image description here我正在开发一个电子商务网站。

我有3张桌子

1. 产品表

2. 条件表

3. condition_product表

  • 产品可能有很多条件。
  • 特殊情况属于许多产品。

现在我有一个产品属于3个条件。

我想获得属于这三种情况的所有相关产品。

我怎样才能实现这个目标?

product.php

public function conditions(){

    return $this->belongsToMany(Condition::class)->withTimestamps();

}

condition.php

public function products(){

    return $this->belongsToMany(Product::class)->withTimestamps();

}

这是我的代码:

 public function productDetails(Product $product)
{
    $a = $product->id;

   $relatedProducts = Product::whereHas('conditions.products', function($q) use($a) {
        $q->where('id', $a);
    })
        ->get();


    return view('pages/product', compact('product','relatedProducts'));
}

但我收到了错误。

2 个答案:

答案 0 :(得分:1)

whereHas()方法与嵌套关系一起使用:

Product::whereHas('conditions.products', function($q) use($productId) {
    $q->where('id', $productId);
})
->get();

这将为您提供具有指定产品条件的产品。

或者,你可以这样做:

$conditionIds = Product::find($productId)->conditions->pluck('id');
$products = Product::whereHas('conditions', function($q) use($conditionIds) {
    $q->whereIn('id', $conditionIds);
})
->get();

答案 1 :(得分:0)

一个好的做法是始终指定'id'字段引用的女巫表,因为如果没有,它可以引用'conditions'表或'products'表'id'字段:

$relatedProducts = Product::whereHas('conditions.products', function($q) use($a) {
        $q->where('products.id', $a);
    })
    ->get();

您可以看到有关SQL不明确列名的answer