2016-09-27 53 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的关系很差 - –

相关问题