2014-01-23 28 views
0

我想,第一次雄辯的關係,我抓我的頭幾個小時解決這個問題......我在這裏的代碼:Laravel關係的hasMany查詢似有不妥

遊戲機模型

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);  

     } 

$ messages集合始終爲空,通過查看查詢: select * from messages其中messagesride_id爲空並且ride_id ='5' 問題在於messagesride_id爲空 爲什麼以及如何創建條件?

+0

在你的'$ ridesObj-> messages() - > where('ride_id','=',$ ride [0] - > id)...''where()'語句是多餘的。 '$ ride-> message'已經隱含地限制了返回給與Ride相關的消息的消息。 我建議查看Eloquent文檔並嘗試使用php工匠修補程序 – ErikTheDeveloper

回答

0

您正在創建一個新的遊樂設施對象,並查詢該「新」遊樂設施對象的消息,因爲它是一個新對象,所以不存在。您需要查詢原始$ 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

上找到我推特:@ErikOnTheWeb

+0

實際上...因爲n + 1問題實際上並不適用於這些消息,所以您最好將其簡化爲類似於...控制器:'$ ride = Rides :: find($ user-> id);'View:'foreach($ ride-> messages as $ message)''和'ride-> user' ...我可以是錯誤的,但我相信這樣做效率高,查詢明智,併爲您節省一些代碼/複雜性 – ErikTheDeveloper