2016-09-27 80 views
0

我有表:如何界定關係hasManyThrough

users 
- id 
- name 
- company_id 
companies 
- id 
- company_name 
watched_objects 
- id 
- user_id 
- object_id 
- type 

現在我想所有看過公司的用戶。

所以查詢應該長相:

SELECT 
    companies.* 
FROM companies 
    JOIN watched_objects ON watched_objects.object_id = companies.id 
WHERE watched_objects.user_id = 1 

我應該怎樣定義的關係?

我試試這個:

class User 
{ 
    public function watched() 
    { 
     return $this->hasManyThrough('App\Company', 'App\WatchedObject', 'user_id', 'id'); 
    } 
} 

但查詢是:

SELECT 
    companies.*, 
    watched_objects.user_id 
FROM companies 
    INNER JOIN watched_objects ON watched_objects.id = companies.id 
WHERE watched_objects.user_id = 1 

我怎樣才能改變watched_objects.idwatched_objects.object_id

+0

我通常在這種情況下,數據庫視圖,特別是如果你要經常讀取這些數據。(我懷疑你會) –

+0

查看是不是我要什麼存檔。這種方法使應用程序混亂,我不會混合不同的數據庫層。 –

+0

您可以顯示您的雄辯查詢,但拍攝'返回$ this-> hasManyThrough('App \ Company','App \ WatchedObject','user_id','id') - > where('type','=' 'company');' – cssBlaster21895

回答

1

如果你將object_id當作公司id,那麼這個關係被認爲是多對多的。然後table watched_objects將成爲第三張保存用戶和公司關係的表。

class User { 
    public function watched() { 
     return $this->belongsToMany('App\Company', 'watched_objects', 'user_id', 'object_id'); 
    } 
} 

爲了找到用戶1的觀看公司,可以使用下面的代碼。

$watched_companies = User::find(1)->watched; 
+0

完美!謝謝。 –

0

要由你可以做這樣的用戶獲取所有觀看公司:

$watches=WatchedObject::where(['user_id'=>Auth::user()->id])->with('company')->get(); 
foreach($watches as $watch) 
{ 
    print_r($watch->company->company_name); 
}  

關係: 公司的hasMany觀看對象:

public function watches() 
{ 
    return $this->hasMany('App\WatchedObject','object_id'); 
} 
在watchedObject型號

和屬於關聯:

public function company() 
{ 
    return $this->belongsTo('App\Company','object_id'); 
} 
+0

你的例子沒問題,我知道我可以像你展示的那樣。但有什麼辦法使用關係機制來做到這一點?例如。就像在Ralis http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association中的rails一樣,這個工作非常完美。看來在Laravel的關係很差 - –

相關問題