2016-02-01 1 views
2

Я работаю над инструментом поддержки билетов. дизайн таблице на данный момент:laravel 5.1 using 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

Я редактировал код '$ билета = Auth :: пользователя () -> with (['tickets.ticket_replies.files']) -> tickets() -> где ('id', $ id) -> firstOrFail() ;, но ошибка Вызов неопределенного метода Illuminate \ Database \ Query \ Запускается Builder :: tickets(). –

+0

Что такое предложение where? –

+0

Чтобы получить только билетные билеты для текущего билета. –