laravel 5.1使用Lazy Eager Loading用法

时间:2016-02-01 10:07:05

标签: php eloquent laravel-5.1 lazy-loading

我正在开发支持票据工具。 表设计目前:

tickets: |id|supp_id|title|user_id|...

ticket_replies: |id|ticket_id|user_id|text

files: |id|ticket_replie_id|name

票证模型

public function ticket_replie() 
{
    return $this->hasMany('App\ticket_replie', 'ticket_id', 'id');
}

ticket_replie的模型

public function file() 
{
        return $this->hasOne('App\File', 'ticket_replie_id', 'id');
}

控制器

$ticket = Auth::user()->tickets()->where('id', $id)->firstOrFail();
   return view('protected.ticketDetail', compact('ticket'));

视图

    ID: {{$ticket->id}}
    title: {{ $ticket->title}}<br>
    status: {{ returnStatus($ticket->status) }}<br>
    Ticket created: {{ $ticket->created_at }}<br>


    @if (!$ticket->supporter)
        supporter:-<br></br></br>
    @else
        supporter  {{ $ticket->supporter->username }}<br></br>
    @endif

    @foreach($ticket->ticket_replie as $reply)
        @if ($reply->file == null)
            reply text: {{ $reply->text }}</br>
        @else
            reply text: {{ $reply->text }}</br>
            file: <a href="/path/to/file/{!! $reply->file->name !!}">Download file</a><br>
        @endif
    reply created at: {{$reply->created_at}}</br></br>
    @endforeach 

当前的查询屏幕: querys debug

每个ticket_replie都可以包含一个“文件”,它代表一个附加文件。正如您在查询中看到的那样,这会产生很大的负担。有没有办法使用(laravel Lazy Eager Loading)来减少查询量?

订购ticket_replies by:

   $ticket = Auth::user()->tickets()->where('id', $id)->with(['ticket_replie.file'])->firstOrFail();

   $ticket->sortBy('ticket_replie.created_at');

   $ticket->values();

1 个答案:

答案 0 :(得分:2)

在控制器中,这样的事情应该起作用......

$ticket = Auth::user()->tickets()->where('id', $id)->with(['ticket_replie.file'])->firstOrFail();