我有四個型號:遠處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