如何定义关系 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;