2014-01-23 83 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