Laravel 8:在空的多对多关系中使用枢轴时出错
Posted
技术标签:
【中文标题】Laravel 8:在空的多对多关系中使用枢轴时出错【英文标题】:Laravel 8: Error when using pivot in an empty many to many relationship 【发布时间】:2021-11-25 19:55:08 【问题描述】:我有以下表格:
表格
用户
身份证 电子邮件组织
身份证 姓名组织成员
身份证 organisation_id(FK 到组织) user_id(FK 到用户) 角色关系
用户与组织成员是一对多的关系。 组织成员与组织之间是多对一的关系 所以用户到组织成员是多对多关系,组织成员作为中间表。雄辩的模型
模型如下:
Class User
public function organisationMembers(): HasMany
return $this->hasMany(OrganisationMember::class);
public function organisations(): BelongsToMany
return $this->belongsToMany(Organisation::class, 'organisation_members')
->withPivot('role');;
class Organisation
public function organisationMembers(): HasMany
return $this->hasMany(OrganisationMember::class);
public function users(): BelongsToMany
return $this->belongsToMany(Organisation::class, 'organisation_members')
->using(OrganisationMember::class);
class OrganisationMember
public function organisation(): BelongsTo
return $this->belongsTo(Organisation::class)->withTrashed();
public function user(): BelongsTo
return $this->belongsTo(User::class);
问题
对于以下代码:
$organisations = User::find($id)->organisations
当用户有组织时,它会按预期工作。
但是,当我对没有组织的用户执行此方法时,我得到的不是空集合,而是以下内容:
Illuminate\Database\QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'organisation_members.role' in 'field list'
(SQL: select `organisations`.*,
`organisation_members`.`user_id` as `pivot_user_id`,
`organisation_members`.`organisation_id` as `pivot_organisation_id`,
`organisation_members`.`role` as `pivot_role` from `organisations` inner join
`organisation_members` on `organisations`.`id` = `organisation_members`.`organisation_id`
where `organisation_members`.`user_id` = 109 and `organisations`.`deleted_at` is null)'
但是,如果我修改用户模型,并删除 pivot
部分:
Class User
// ...
public function organisations(): BelongsToMany
return $this->belongsToMany(Organisation::class, 'organisation_members');
它按预期返回一个空集合。
我该如何解决这个问题?
【问题讨论】:
【参考方案1】:您的代码似乎在这里工作,即使在 User 类中使用枢轴
>>> return User::find(1)->organisations;
=> Illuminate\Database\Eloquent\Collection #3464
all: [
App\Models\Organization #3457
id: 1,
name: "hello",
created_at: "2021-10-05 22:50:19",
updated_at: "2021-10-05 22:50:19",
pivot: Illuminate\Database\Eloquent\Relations\Pivot #4251
user_id: 1,
organization_id: 1,
role: "f",
,
,
],
>>> return User::find(3)->organisations;
=> Illuminate\Database\Eloquent\Collection #4396
all: [],
>>>
执行相同的查询
select `organizations`.*, `organisation_members`.`user_id` as `pivot_user_id`, `organisation_members`.`organization_id` as `pivot_organization_id`, `organisation_members`.`role` as `pivot_role` from `organizations` inner join `organisation_members` on `organizations`.`id` = `organisation_members`.`organization_id` where `organisation_members`.`user_id` = 3
但是组织类中的关系有一个错误:
class Organisation
public function organisationMembers(): HasMany
return $this->hasMany(OrganisationMember::class);
public function users(): BelongsToMany
return $this->belongsToMany(Organisation::class, 'organisation_members')
->using(OrganisationMember::class);
您需要使用 User 类将 belongsToMany 第一个参数更改为这样
class Organisation
public function organisationMembers(): HasMany
return $this->hasMany(OrganisationMember::class);
public function users(): BelongsToMany
return $this->belongsToMany(User::class, 'organisation_members')
->using(OrganisationMember::class);
在此处查看文档:Laravel Eloquent
【讨论】:
感谢您发现这一点。实际问题是我实际上重命名了“角色”列,而它实际上并不存在。所以基本上我是个笨蛋。以上是关于Laravel 8:在空的多对多关系中使用枢轴时出错的主要内容,如果未能解决你的问题,请参考以下文章