2014-01-23 6 views
0

Я пытаюсь красноречивое отношение в первый раз, и я почесал голова часов вокруг этой проблемы ... вот мой код:Laravel отношения hasmany запроса Сомнительной

Rides модель

public function messages() 
{ 
    return $this->hasMany('Messages', 'ride_id'); 
} 

сообщения модели

class Messages extends Eloquent { 

protected $guarded = ['id']; 

public function message(){ 

    return $this->belongsTo('Rides'); 

} 

} 

скачет контроллер

 public function show($user) 
     { 

     $ride = Rides::with('user')->where('id' ,'=',$user->id)->get(); 

     $ridesObj = new Rides(); 

     $messages = $ridesObj->messages()->where('ride_id', '=',$ride[0]->id)->get(); 

     return View::make('site/rides/show')  
     ->with('ride',$ride) 
     ->with('messages',$messages);  

     } 

Сбор $ сообщений всегда пуст, ища запрос: выберите * from messages где messages. ride_id is null и ride_id = '5' проблема в том, где messages. ride_id is null Почему и как это условие создано?

+0

В ваших '$ ridesObj-> messages() -> где ('ride_id', '=', $ ride [0] -> id) ...' оператор 'where()' избыточен. Сообщение '$ ride->' уже неявно ограничивает сообщения, возвращаемые сообщениям, связанным с Ride. Я рекомендую проверить документы Eloquent и экспериментировать с '' php artisan tinker' немного – ErikTheDeveloper

ответ

0

Вы создаете новый объект Rides и запрашиваете сообщения для этого «нового» объекта Rides, которого нет, потому что это новый объект. Вам нужно запросить сообщения на исходном объекте $ ride.

// change method from "get" to "first" since you're only interested in the first ride 
$ride = Rides::with('user')->where('id' ,'=',$user->id)->first(); 


$messages = $ride->messages; 

Это должно делать то, что вы ожидали выше, чем я полагаю. Основная идея заключается в том, что сообщения относятся к объекту езды, который вы искали. Когда вы создаете новый объект Rides, у него нет никаких сообщений, связанных с ним, но из-за его нового создания вместе.

0

Я сделал некоторые изменения/упрощения для вашего фрагмента (ов) ниже.

Это не проверено, но должно работать, предполагая, что ваши функции hasMany() и belongsTo() работают для начала.

Я рекомендую испытывать echo Rides::find($user->id)->messages; и echo Rides::find($user->id)->user; в php artisan tinker

public function show($user) 
{ 

    /** 
    * Utilize ORM in the view ($ride->messages and $ride->user). Eager loading may come in handy for many to many relationship... not necessarily needed for what you are doing here. 
    */ 
    $ride = Rides::find($user->id); 
    // DEPRECATED $ride  = Rides::with('user', 'messages')->find($user->id); 

    return View::make('site/rides/show')  
     ->with('ride',$ride); 
} 

Внутри вашего вид аттракционов/шоу, вы должны быть в состоянии сделать что-то вроде

<ul> 
    @foreach($ride->messages as $message) 
     <li>{{$message->title}}</li> 
    @endforeach 
</ul> 

Eloquent Docs

Найти меня twitter: @ErikOnTheWeb

+0

На самом деле ... поскольку проблема с n + 1 действительно не распространяется на сообщения, вам, вероятно, лучше упростить до чего-то вроде ... Контроллер: '$ ride = Rides :: find ($ user-> id);' View: 'foreach ($ ride-> messages as $ message)' и '$ ride-> user' ... Я мог бы быть неправильным, но я считаю, что это будет так же эффективно, с точки зрения запросов и сэкономить вам некоторый код/​​усложнение – ErikTheDeveloper

Смежные вопросы