laravel - with()加载关系但仍调用数据库

时间:2017-07-14 09:42:04

标签: php laravel laravel-5 eloquent laravel-5.4

我想用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

1 个答案:

答案 0 :(得分:3)

$product->files()->pluck('id')->toArray()

这是你的问题。

$product->files是已加载的已加载的文件集合。这就是你想要在这里使用以获得热切加载的好处。作为一个集合,它具有相同的pluck()等功能(https://laravel.com/docs/5.4/collections#available-methods)。

$product->files()全新的 Eloquent查询构建器,因此使用它会导致新查询未使用预先加载的数据。