2016-02-01 54 views
2

我正在使用支持票據工具。 表設計的時刻:laravel 5.1使用Lazy Eager加載用法

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的當前畫面: querys debug

每個ticket_replie可以包含精確一個 「文件」,它代表一個附加文件。正如你在查詢中看到的那樣,這會產生很多負載。有沒有一種方法可以使用(laravel Lazy Eager Loading)來最大限度地減少查詢數量?

通過訂購ticket_replies:

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

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

    $ticket->values(); 

回答

2

在控制器中這樣的事情應該做的工作......

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

我編輯的代碼到'$票=驗證::用戶( ) - > with(['tickets.ticket_replies.files']) - > tickets() - > where('id',$ id) - > firstOrFail();'error error調用未定義的方法Illuminate \ Database \ Query \ Builder :: tickets()被觸發。 –

+0

什麼是where子句? –

+0

僅檢索當前票證的ticket_replies。 –

相關問題