关于雄辩:Laravel的hasManyThrough在联接上使用了错误的键?

Laravel's hasManyThrough using wrong key on join?

我在Laravel的hasManyThrough关系(L5.2)方面遇到一些问题。

我有"用户"和"组",而不是标准的联接表或自定义枢轴模型,而是使用另一个称为GroupMembership的Eloquent模型来链接两者。这是类的相关部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class User extends Model {

    use SoftDeletes;

    protected $primaryKey = 'user_id';

    public function groupMemberships() {
        return $this->hasMany(GroupMembership::class);
    }
}


class GroupMembership extends Model {

    protected $primaryKey = 'group_membership_id';

    public function user() {
        return $this->belongsTo(User::class);
    }

    public function group() {
        return $this->belongsTo(Group::class);
    }
}


class Group extends Model {

    use SoftDeletes;

    protected $primaryKey = 'group_id';

    public function groupMemberships() {
        return $this->hasMany(GroupMembership::class);
    }

    public function users() {
        return $this->hasManyThrough(User::class, GroupMembership::class,
            'group_id', 'user_id', 'group_id'
        );
    }
}

我的问题出在$group->users()关系上,在这里我试图通过GroupMembership关系来获取组中的所有用户。当我尝试访问它时,生成的SQL是:

1
2
3
4
5
select `users`.*, `group_memberships`.`group_id` from `users`
inner join `group_memberships`
    on `group_memberships`.`group_membership_id` = `users`.`user_id`
where `group_memberships`.`group_id` = '10'
and `users`.`deleted_at` is null

在该查询中,内部联接条件错误。而不是group_memberships.group_membership_id,它实际上应该是group_memberships.user_id

我在做什么错?


感谢这篇文章。我不想hasManyThrough。我只想belongsToMany指定自定义联接表:

1
2
3
public function users() {
    return $this->belongsToMany(User::class, 'group_memberships');
}

您还可以添加withPivot以从联接模型中提取其他变量。

这里唯一的缺点是,当使用$group->users时,每个$user->pivot模型将是默认的Eloquent枢轴模型。如果我真的想访问我的自定义模型,则需要实现这样的内容。