我有四个型号:远处HasManyThrough
- 用户
- 客户
- 商店
- 机会
的关系被定义为这样的:
- 用户的hasMany客户
- 客户的hasMany商店
- 商店的hasMany机会
- 用户hasManyThrough存储,客户端(这工作)
的问题是,我试图访问用户 - >相关机会通过内置的Laravel关系,但似乎没有自定义Query或机会表上的额外user_id列允许直接访问(即使可以从Store-> Client关系中推断出来) )。如果可以避免,我也不是嵌套foreach
循环的粉丝。
我的问题:
有没有办法去更深层次的原因,直接在这种情况下访问用户的机会?实际模型代码和所有相关的关系如下:
用户
class User extends Eloquent{
public function clients(){
return $this->hasMany('Client');
}
public function stores(){
return $this->hasManyThrough('Store', 'Client');
}
public function proposals(){
return $this->hasMany('Proposal');
}
public function opportunities(){ //This does the job, but I feel like it could be better
return Opportunity::join('stores', 'stores.id', '=', 'opportunities.store_id')->
join('clients', 'clients.id', '=', 'stores.client_id')->
join('users', 'users.id', '=', 'clients.user_id')->
select('opportunities.*')->
where('users.id', $this->id);
}
public function getOpportunitiesAttribute(){ //This just helps mimic the hasManyThrough shorthand
return $this->opportunities()->get();
}
}
客户
class Client extends Eloquent{
public function stores(){
return $this->hasMany('Store');
}
public function user(){
return $this->belongsTo('User');
}
public function opportunities(){
return $this->hasManyThrough('Opportunity', 'Store');
}
}
商店
class Store extends Eloquent {
public function client(){
return $this->belongsTo('Client');
}
public function opportunities(){
return $this->hasMany('Opportunity');
}
}
机会
class Opportunity extends Eloquent {
public function store(){
return $this->belongsTo('Store');
}
}
我不知道Laravell,但是从我的Java Persistance API体验中,我可以说你需要一个自定义查询来解决这个问题,或者正如你所提到的那样,直接使用用户和oportunity之间的关系。 – ITroubs 2014-09-19 16:41:24
@ITroubs是的,这就是目前为止的样子。尽管如此,如果我可以吃我的蛋糕并且也吃它,那会很棒。 – maiorano84 2014-09-19 16:50:41
你的'加入'的解决方案是最好的,你可以做。否则,您可以为这种情况创建自定义关系,这将像'hasManyThorugh'一样工作,但具有更多嵌套级别。 – 2014-09-21 08:23:03