【问题标题】:Laravel Deep relationship for product variantsLaravel 产品变体的深度关系
【发布时间】:2019-06-19 15:26:52
【问题描述】:

我有以下数据库结构: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']);
}

这样做的问题是它会获取所有选项值,而不是特定于该变体的选项值。

希望所有这些都有意义,如果没有,请随时询问更多信息。

【问题讨论】:

  • 尝试将-&gt;whereColumn('product_option_values.id', '=', 'product_variant_values.product_option_value_id') 添加到关系中。
  • 我现在确实只是在这样做,我知道我离实现我所追求的目标不远了。非常感谢! :)

标签: laravel eloquent relationship has-many-through has-many


【解决方案1】:

使用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');
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多