如何在Laravel 5的Eloquent中对相同对象之间的两种不同关系进行建模?

时间:2015-05-12 16:01:13

标签: php laravel eloquent

编辑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');
    }

}

0 个答案:

没有答案