编辑4 :问题已解决。编辑3中出现的问题只是数据错误。
最后的答案:在belongsstomany关系中指定外键并在之后清除我的PHP缓存。
编辑3 :我通过在belongsToMany关系中指定外键使查询出现不同。但是查询仍然没有返回我需要的结果。这是生成的查询:
select `streams`.*, `followers`.`user_id` as `pivot_user_id`, `followers`.`stream_id` as `pivot_stream_id` from `streams` inner join `followers` on `streams`.`id` = `followers`.`stream_id` where `followers`.`user_id` =
编辑2 :根本问题是User :: following()和Stream :: followers()生成完全相同的查询,尽管是多对多关系的不同侧面。
编辑:我捕获了来自User :: following()的查询,看起来它是基于stream_id而不是user_id的查询,我不知道如何解决这个问题。
select `users`.*, `followers`.`stream_id` as `pivot_stream_id`, `followers`.`user_id` as `pivot_user_id` from `users` inner join `followers` on `users`.`id` = `followers`.`user_id` where `followers`.`stream_id` = ?
我有一个用户表和一个 Streams 表。
每个用户都有许多 Streams
除了拥有它的用户之外,每个流还有许多用户(关注者)。
如何在Eloquent中正确设置此功能?现在我在两个模型中都有一个belongsToMany关系,在数据透视表上建立多对多关系。但是,这似乎与用户模型中的hasMany关系和 Streams 模型中的belongsTo关系冲突,后者使用 Streams上的外键user_id 表。
为了澄清,我期望的最终功能是用户对象可以返回其拥有的 Stream 对象的列表,以及流它正在关注的对象。 Stream 对象应该能够返回拥有它的一个用户对象,以及跟随它的多个用户对象。
但是,现在,当我尝试获取用户正在关注的流的列表时,使用User :: following()方法,它返回与User :: streams()方法相同的结果。
以下是目前表格的排列方式:
用户
| id | name | email | password | token | created_at | updated_at |
|----|------|-------|----------|-------|------------|------------|
流
| id | name | user_id | created_at | updated_at |
|----|------|---------|------------|------------|
透视“粉丝”
| id | stream_id | user_id | created_at | updated_at |
|----|-----------|---------|------------|------------|
以下是两个模型类:
流
class Stream extends Model {
public function user() {
return $this->belongsTo(User::class);
}
public function followers() {
return $this->belongsToMany(User::class, 'followers');
}
}
用户
class User extends Model implements AuthenticatableContract, CanResetPasswordContract {
use Authenticatable, CanResetPassword;
protected $hidden = ['password', 'token'];
public function streams() {
return $this->hasMany(Stream::class);
}
public function following() {
return $this->belongsToMany(Stream::class, 'followers');
}
}