laravel - Laravel 产品变体的深度关系
问题描述
我有以下数据库结构:https ://dbdiagram.io/d/5c4b590def2dd100140d5997
希望图表比文字更好地解释设置。
我有一个产品,我已经根据产品选项/值生成了可能的变体。现在我在表格中列出了变体,以便我可以使用以下代码更改每个组合的定价:
@foreach($product->variants as $variant)
<tr>
<td>{!! Form::text('variants[' . $variant->id . '][sku]', (is_null($variant->sku) ? $variant->reference : $variant->sku)) !!}</td>
<td>{!! Form::number('variants[' . $variant->id . '][price]', $variant->price) !!}</td>
<td>{{ $variant->image }}</td>
<td>{!! Form::number('variants[' . $variant->id . '][stock]', $variant->stock) !!}</td>
@foreach($variant->productoptions() as $productoption)
<td>{{ $productoption->product_option_value_name }}</td>
@endforeach
</tr>
@endforeach
在 ProductVariant 模型上,我有以下方法来获取产品选项的特定名称:
/**
* @return mixed
*/
public function productoptions()
{
return $this->select('product_options.name as product_option_name', 'product_option_values.name as product_option_value_name')
->where('product_variants.id', '=', $this->id)
->join('product_variant_values', 'product_variants.id', '=', 'product_variant_values.product_variant_id')
->join('product_options', 'product_options.id', '=', 'product_variant_values.product_option_id')
->join('product_option_values', 'product_option_values.id', '=', 'product_variant_values.product_option_value_id')->get();
}
但是,这会导致 n+1 问题(可能是数百次调用,如果 T 恤等产品有很多尺寸、颜色等),因为它将为每个变体进行数据库调用,所以我正在寻找试图急切地加载它。但这意味着我必须考虑使用雄辩的关系。
这是我到目前为止使用该staudenmeir/eloquent-has-many-deep
软件包尝试过的内容:
/**
* @return mixed
*/
public function productoptions()
{
return $this->hasManyDeep(ProductOptionValue::class, [ProductVariantValue::class, ProductOption::class], ['product_variant_id', 'id', 'product_option_id'], ['id', 'product_option_id', 'id']);
}
这样做的问题是它会获取所有选项值,而不是特定于该变体的选项值。
希望所有这些都有意义,如果没有,请随时询问更多信息。
解决方案
用于whereColumn()
添加缺少的约束:
public function productoptions()
{
return $this->hasManyDeep(ProductOptionValue::class, [ProductVariantValue::class, ProductOption::class], ['product_variant_id', 'id', 'product_option_id'], ['id', 'product_option_id', 'id'])
->whereColumn('product_option_values.id', '=', 'product_variant_values.product_option_value_id');
}
推荐阅读
- python - 为什么 Python 在使用线程时会启动许多进程
- android - Android kotlin 在某些片段中显示导航抽屉图标而不是后退按钮
- pine-script - 如何编写一个简单的 pine 脚本来绘制投资组合余额
- algorithm - 找到大小为 k 的子序列,使得值之间的最小距离最大
- apache-kafka - ClickHouse:在分布式和复制表中使用 hash 和 internal_replication
- r - 闪亮模块中的观察事件问题
- python - 如何编写一个方法来检查代理是否完成了 Osbrain 中的任务?
- python - 有没有办法在没有 Python2 的情况下在 Ubuntu 焦点上安装 Mercurial?
- awk - Linux:如何从以“ ”开头的文件中删除字符串在一个文件中出现多次
- docker - 如何修复 gyp ERR!在 npm 构建中