我有以下表结构:
| products | product_options | product_option_values | product_option_to_product |
+----------+-----------------+-----------------------+---------------------------+
| id | id | id | id |
| | | | product_id |
| | | | product_option_id |
| | | | product_option_value_id |
我的关系看起来像这样:
// Product.php
public function options()
{
return $this->belongsToMany('App\ProductOption', 'product_option_to_product', 'product_id', 'product_option_id')->withPivot('product_option_value_id', 'product_id');
}
// ProductOption.php
public function values()
{
return $this->belongsToMany('App\ProductOptionValue', 'product_option_to_product', 'product_option_id', 'product_option_value_id')->withPivot('product_id');
}
现在当我尝试这样做:
$products = Product::with('options')->with('options.values')->first();
或者
$products = Product::with('options.values')->first();
我获取到了所有可选值,因为它没有使用产品ID来加载选项值。
有没有人知道如何确保它只加载属于该产品的值?
我可以在产品上直接建立与选项值的关系,但我真的需要它们附加到它们所属的选项上。
编辑:
我尝试过像这样的连接:
$products = Product::with(['options.values' => function($q) {
$q->join('products', 'products.id', '=', 'product_option_to_product.product_id');
}])->first();
但它会得到相同的结果。
目前我实施了一种非常糟糕的解决方法,在我的视图中进行了一个小检查:
@if($value->pivot->product_id == $product->id)
<div class="checkbox">
<label>
<input type="checkbox" name="{{ $option->id }}" value="{{ $value->id }}"> {{ $value->language->name }}
</label>
</div>
@endif
然而,我觉得这并不正确。