2014-04-19 4 views
0

У предупреждения может быть много сообщений, связанных с ним через внешний ключ. Каждое отправленное сообщение также прикрепляется к пользователю через внешний ключ. При просмотре предупреждения, если такие сообщения существуют (они не требуются), я хочу отображать каждое сообщение вместе с данными соответствующего пользователя. МодельLaravel hasMany relationship не зацикливается, чтобы показать результаты

Пользователь:

public function alerts() 
{ 
    return $this->hasMany('Alert'); 
} 

public function messages() 
{ 
    return $this->hasMany('Message'); 
} 

оповещения модель:

public function user() 
    { 
     return $this->belongsTo('User'); 
    } 

    public function messages() 
    { 
     return $this->hasMany('Message'); 
    } 

Я заметил, если сигнал не имеет каких-либо сообщений, связанных с этим, forloop не работает!

В моей show зрения, у меня есть:

@foreach($alerts as $alert) 
    <tr> 
     <td>{{ $alerts->messages->first()->firstname }}</td> 
     <td>{{ $alerts->messages->first()->user->email }}</td> 
     <td>{{ $alerts->messages->first()->user->phone_number }}</td> 
     <td>{{ $alerts->messages->first()->message }}</td> 
     <td>{{ date("j F Y", strtotime($alerts->messages->first()->created_at)) }}</td> 
     <td>{{ date("g:ia", strtotime($alerts->messages->first()->created_at)) }}</td> 
    </tr> 
@endforeach 

который прекрасно работает, если есть сообщения, чтобы показать, но только петли через первое сообщение, а не все остальные. Контроллер втягивая данных:

public function show($id) 
    { 
     $alert = Alert::where('id','=',$id)->first(); 
     $this->layout->content = View::make('agents.alert.show', 
      array('alerts' => $alert)); 
    } 

Любое руководство, почему forloop не работает, когда есть меньше 2 результатов, и почему он только петли через первый результат. Спасибо.

ответ

3

Сначала я предлагаю использовать жадную загрузку для родственных моделей или вы будете запускать множество БД запросов, которые вы не хотите и не нужны:

public function show($id) 
{ 
    $alert = Alert::with('messages.user')->where('id','=',$id)->first(); 
    $this->layout->content = View::make('agents.alert.show', array('alert' => $alert)); 
} 

Тогда в просмотре закрутки с помощью сообщений, а не предупреждение, как вы не» t есть многие из них:

@foreach($alert->messages as $message) 
<tr> 
    <td>{{ $message->firstname }}</td> 
    // if you are sure there is a user for each message, otherwise you need a check for null on $message->user 
    <td>{{ $message->user->email }}</td> 
    <td>{{ $message->user->phone_number }}</td> 
    <td>{{ $message->message }}</td> 
    <td>{{ date("j F Y", strtotime($message->created_at)) }}</td> 
    <td>{{ date("g:ia", strtotime($message->created_at)) }}</td> 
</tr> 
@endforeach 
+1

Работает как очарование. Очень ясны и относительно нетерпеливой нагрузки. большое спасибо, Deczo. – Ben

+0

Спасибо! У меня была такая же проблема, но я попытался сделать цикл foreach с помощью $ alert-> messages() –