我想用eager-loading来加载我的关系来源,所以我这样做:
的 MODEL
public function files()
{
return $this->belongsToMany('App\Files', 'product_files', 'product_id', 'file');
}
方式
Products::with(['files', 'promotion', ... etc.])->where('code', $product)->first();
我已经加载了关系:
#relations: array:7 [▼
"files" => Collection {#762 ▶}
"promotion" => Collection {#755 ▶}
....
但在视图中仍然连接到数据库:500 statements were executed, 474 of which were duplicated
重复查询
在file_entries.id = product_files.file中从file_entries内部联接product_files中选择id,其中product_files.product_id =' 77627'
问题出在哪里?
查看
@foreach ($filesCategory as $element => $file)
@if (in_array($file->id, $product->files()->pluck('id')->toArray()))
<option selected="selected" value="{{ $file->id }}">@if( $file->name ) {{ $file->name }} @else {{ $file->oryginal_name }} @endif</option>
@else
<option value="{{ $file->id }}">@if( $file->name ) {{ $file->name }} @else {{ $file->oryginal_name }} @endif</option>
@endif
@endforeach
答案 0 :(得分:3)
$product->files()->pluck('id')->toArray()
这是你的问题。
$product->files
是已加载的已加载的文件集合。这就是你想要在这里使用以获得热切加载的好处。作为一个集合,它具有相同的pluck()
等功能(https://laravel.com/docs/5.4/collections#available-methods)。
$product->files()
是全新的 Eloquent查询构建器,因此使用它会导致新查询未使用预先加载的数据。