雄辩地加入多对多关系

时间:2018-11-19 06:09:07

标签: database laravel eloquent many-to-many

我不应该使用原始查询,这会导致混乱!您能帮我改善它吗?

@foreach($attributes as $attribute)
        {{ Form::bsText($attribute->name, $attribute->title, $customer->attributes()->find($attribute->id)->pivot->value ?? '') }}
@endforeach

属性模型:

public function customers()
{
    return $this->belongsToMany(Customer::class);
}

客户模型:

public function attributes()
{
    return $this->belongsToMany(Attribute::class)->withPivot('value');
}

控制器:

public function show(Customer $customer)
{
    $attributes = Attribute::all();
    return view('admin.customers.show', compact('customer', 'attributes'));
}

1 个答案:

答案 0 :(得分:1)

第一个选项:

您可以将客户属性集合的索引重新整理为属性id,并通过id访问客户属性集合中的模型。

控制器:

$attributes = Attribute::all();
$customer = Customer::with('attribues')...
$customer->attributes = $customer->attributes->keyBy('id');

查看:

@foreach($attributes as $attribute)
        {{ Form::bsText($attribute->name, $attribute->title, $customer->attributes[$attribute->id]->pivot->value ?? '') }}
@endforeach

第二个选项:

此选项基于与集合->attributes(而不是关系->attributes())一起使用,以减少数据库查询的数量。

控制器:

$attributes = Attribute::all();
$customer = Customer::with('attribues')...

查看:

@foreach($attributes as $attribute)
        {{ Form::bsText($attribute->name, $attribute->title, $customer->attributes->where('id', $attribute->id)->first()->pivot->value ?? '') }}
@endforeach

第一个选项应该比第二个更快。