Laravel |多态关系未知列
Laravel | Polymorphic Relationship unknown column
这是我第一次使用多态关系。
我正在创建一个 LMS,其中可以将作业分配给个人用户或团队,因此阅读 Laravel 文档似乎多态关系将是一个很好的方法。
我创建了 4 个表。
用户:
| id | username | password | created_at | updated_at |
团队:| id | friendly_name | slug |
团队用户:| id | user_id | team_id |
作业分配:
| id | assignment_id | assignmentable_type | assignmentable_id | created_at | updated_at
所以当 assignment_allocations
中有数据时,它看起来像这样...
| id | assignment_id | assignmentable_type | assignmentable_id |
| 1 | 1 | App\Models\User | 1 |
但是我得到这个错误:
SQL: select * from users
where users
.assignmentable_id
= 1 and users
.assignmentable_id
is not null and users
.assignmentable_type
= App\Models\User
很明显我做错了什么,但是我这辈子都弄不明白我做错了什么。
这是我的相关功能:
AssignmentAllocation.php
public function assignmentable()
{
return $this->morphTo();
}
User.php
public function assignments()
{
return $this->morphMany('App\Models\User', 'assignmentable');
}
Team.php
public function assignments()
{
return $this->morphMany('App\Model\Team', 'assignmentable');
}
非常感谢任何帮助。
根据您的数据结构,有 2 个可能的答案,但您的问题并不清楚。
User
/Team
到Assignment
是一对多的关系(每个Assignment
有一个User
/ Team
,每个User
/Team
有多个Assignments
多对多关系,其中每个 User
/Team
有多个 Assignments
,每个 Assignment
有多个 Users
/Teams
一对多
在一对多中,你不需要 Assignment
table 和 AssignmentAllocation
table ,所以我假设您的 AssignmentAllocation
是您的 Assignment
模型。如果不是,那么您需要将 assignmentable_type
和 assignmentable_id
列放在 assignments
table 上,并使用 Assignment.php
而不是 AssignmentAllocation.php
。
AssignmentAllocation.php
public function assignmentable()
{
return $this->morphTo();
}
User.php
public function assignments()
{
return $this->morphMany('App\Models\AssignmentAllocation', 'assignmentable');
}
Team.php
public function assignments()
{
return $this->morphMany('App\Models\AssignmentAllocation', 'assignmentable');
}
你的错误是因为 Laravel 正在搜索 users
table 来匹配(你有 morphMany('User'..
),而它应该搜索 AssignmentAllocation
table。所以把它们关掉。
1) morphMany
的行为类似于 hasMany
,所以您说的是:
每个 User
hasMany
Assignment
和每个 Team
hasMany
Assignments
。 morphMany
的第一部分表示 "search the AssignmentAllocation
table",第二部分表示 "search for assignmentable
_id and assignmentable
_type being equal to this instance of this model"。
2) morphTo
表现得像 belongsTo
所以你说:
每个 Assignment
belongsTo
一个 assignmentable
.
多对多
然而,如果 AssignmentAllocation
是一个多对多枢轴 table 并且每个 Assignment
有许多 Users
或 Teams
,并且每个 User
/Team
有很多Assignments
,那么你需要一对morphToMany
/morphedByMany
.
User.php
public function assignments()
{
return $this->morphToMany('App\Models\Assignment', 'assignmentable');
}
Team.php
public function assignments()
{
return $this->morphToMany('App\Models\Assignment', 'assignmentable');
}
Assignment.php
模型 注意:不是 AssignmentAllocation 模型
public function users()
{
return $this->morphedByMany('App\Models\User', 'assignmentable');
}
public function teams()
{
return $this->morphedByMany('App\Models\Team', 'assignmentable');
}
您应该将 assignment_allocation
table 重命名为 assignmentables
,或者将所需的第三个和第四个参数添加到变形函数。我更喜欢保持 table 名称一致。
这是我第一次使用多态关系。
我正在创建一个 LMS,其中可以将作业分配给个人用户或团队,因此阅读 Laravel 文档似乎多态关系将是一个很好的方法。
我创建了 4 个表。
用户:
| id | username | password | created_at | updated_at |
团队:| id | friendly_name | slug |
团队用户:| id | user_id | team_id |
作业分配:
| id | assignment_id | assignmentable_type | assignmentable_id | created_at | updated_at
所以当 assignment_allocations
中有数据时,它看起来像这样...
| id | assignment_id | assignmentable_type | assignmentable_id |
| 1 | 1 | App\Models\User | 1 |
但是我得到这个错误:
SQL: select * from
users
whereusers
.assignmentable_id
= 1 andusers
.assignmentable_id
is not null andusers
.assignmentable_type
= App\Models\User
很明显我做错了什么,但是我这辈子都弄不明白我做错了什么。
这是我的相关功能:
AssignmentAllocation.php
public function assignmentable()
{
return $this->morphTo();
}
User.php
public function assignments()
{
return $this->morphMany('App\Models\User', 'assignmentable');
}
Team.php
public function assignments()
{
return $this->morphMany('App\Model\Team', 'assignmentable');
}
非常感谢任何帮助。
根据您的数据结构,有 2 个可能的答案,但您的问题并不清楚。
User
/Team
到Assignment
是一对多的关系(每个Assignment
有一个User
/Team
,每个User
/Team
有多个Assignments
多对多关系,其中每个
User
/Team
有多个Assignments
,每个Assignment
有多个Users
/Teams
一对多
在一对多中,你不需要 Assignment
table 和 AssignmentAllocation
table ,所以我假设您的 AssignmentAllocation
是您的 Assignment
模型。如果不是,那么您需要将 assignmentable_type
和 assignmentable_id
列放在 assignments
table 上,并使用 Assignment.php
而不是 AssignmentAllocation.php
。
AssignmentAllocation.php
public function assignmentable()
{
return $this->morphTo();
}
User.php
public function assignments()
{
return $this->morphMany('App\Models\AssignmentAllocation', 'assignmentable');
}
Team.php
public function assignments()
{
return $this->morphMany('App\Models\AssignmentAllocation', 'assignmentable');
}
你的错误是因为 Laravel 正在搜索 users
table 来匹配(你有 morphMany('User'..
),而它应该搜索 AssignmentAllocation
table。所以把它们关掉。
1) morphMany
的行为类似于 hasMany
,所以您说的是:
每个 User
hasMany
Assignment
和每个 Team
hasMany
Assignments
。 morphMany
的第一部分表示 "search the AssignmentAllocation
table",第二部分表示 "search for assignmentable
_id and assignmentable
_type being equal to this instance of this model"。
2) morphTo
表现得像 belongsTo
所以你说:
每个 Assignment
belongsTo
一个 assignmentable
.
多对多
然而,如果 AssignmentAllocation
是一个多对多枢轴 table 并且每个 Assignment
有许多 Users
或 Teams
,并且每个 User
/Team
有很多Assignments
,那么你需要一对morphToMany
/morphedByMany
.
User.php
public function assignments()
{
return $this->morphToMany('App\Models\Assignment', 'assignmentable');
}
Team.php
public function assignments()
{
return $this->morphToMany('App\Models\Assignment', 'assignmentable');
}
Assignment.php
模型 注意:不是 AssignmentAllocation 模型
public function users()
{
return $this->morphedByMany('App\Models\User', 'assignmentable');
}
public function teams()
{
return $this->morphedByMany('App\Models\Team', 'assignmentable');
}
您应该将 assignment_allocation
table 重命名为 assignmentables
,或者将所需的第三个和第四个参数添加到变形函数。我更喜欢保持 table 名称一致。