如何定义关系 hasManyThrough
How define relation 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.id
更改为 watched_objects.object_id
。
要获取某个用户所有关注的公司,您可以这样做:
$watches=WatchedObject::where(['user_id'=>Auth::user()->id])->with('company')->get();
foreach($watches as $watch)
{
print_r($watch->company->company_name);
}
关系:
公司有很多关注对象:
public function watches()
{
return $this->hasMany('App\WatchedObject','object_id');
}
watchedObject 模型中的 belongsTo:
public function company()
{
return $this->belongsTo('App\Company','object_id');
}
如果您将 object_id 视为公司 ID,则该关系被认为是多对多关系。那么tablewatched_objects会是第三个table保持用户和公司的关系
class User {
public function watched() {
return $this->belongsToMany('App\Company', 'watched_objects', 'user_id', 'object_id');
}
}
为了找到用户1关注的公司,可以使用下面的代码。
$watched_companies = User::find(1)->watched;
我有桌子:
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.id
更改为 watched_objects.object_id
。
要获取某个用户所有关注的公司,您可以这样做:
$watches=WatchedObject::where(['user_id'=>Auth::user()->id])->with('company')->get();
foreach($watches as $watch)
{
print_r($watch->company->company_name);
}
关系: 公司有很多关注对象:
public function watches()
{
return $this->hasMany('App\WatchedObject','object_id');
}
watchedObject 模型中的 belongsTo:
public function company()
{
return $this->belongsTo('App\Company','object_id');
}
如果您将 object_id 视为公司 ID,则该关系被认为是多对多关系。那么tablewatched_objects会是第三个table保持用户和公司的关系
class User {
public function watched() {
return $this->belongsToMany('App\Company', 'watched_objects', 'user_id', 'object_id');
}
}
为了找到用户1关注的公司,可以使用下面的代码。
$watched_companies = User::find(1)->watched;