这是我第一次使用多态关系。
我正在创建一个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:从
users
中选择*users
。assignmentable_id
= 1和users
。assignmentable_id
不为空且users
。{ {1}} = App \ Models \ User
这是我的功能:
assignmentable_type
AssignmentAllocation.php
public function assignmentable()
{
return $this->morphTo();
}
User.php
public function assignments()
{
return $this->morphMany('App\Models\User', 'assignmentable');
}
Team.php
非常感谢任何帮助。
答案 0 :(得分:1)
根据您的数据结构,有两个可能的答案,但您的问题并不清楚。
User
/ Team
与Assignment
是一对多的关系(每个Assignment
都有一个User
/ {{1}每个Team
/ User
都有Team
多对多关系,其中每个Assignments
/ User
有多个Team
,每个Assignments
有多个Assignment
/ {{1 }}
一对多
在一对多中,您不需要Users
表格和一个Teams
表格,因此我假设您的Assignment
是你的AssignmentAllocation
模特。如果没有,那么您需要将AssignmentAllocation
和Assignment
列放在assignmentable_type
表格上,并使用assignmentable_id
代替assignments
。
Assignment.php
AssignmentAllocation.php
AssignmentAllocation.php
public function assignmentable()
{
return $this->morphTo();
}
User.php
public function assignments()
{
return $this->morphMany('App\Models\AssignmentAllocation', 'assignmentable');
}
您的错误是因为Laravel正在Team.php
表中搜索匹配项(您有public function assignments()
{
return $this->morphMany('App\Models\AssignmentAllocation', 'assignmentable');
}
),它应该在users
表中搜索。所以只需将它们切换出来。
1)morphMany('User'..
的行为类似于AssignmentAllocation
,所以您要说:
每个morphMany
hasMany
User
,每个hasMany
Assignment
Team
。 hasMany
的第一部分说"搜索Assignments
表",第二部分说"搜索morphMany
_ id和AssignmentAllocation
_type等于此模型的此实例"。
2)assignmentable
的行为与assignmentable
类似,所以你要说:
每个morphTo
belongsTo
和Assignment
。
多对多
但是,如果belongsTo
是多对多数据透视表,而每个assignmentable
都有多个AssignmentAllocation
或Assignment
,并且每个Users
/ {{ 1}}有很多Teams
,那么你需要User
/ Team
对。
Assignments
morphToMany
morphedByMany
User.php
public function assignments()
{
return $this->morphToMany('App\Models\Assignment', 'assignmentable');
}
model 注意:不是AssignmentAllocation模型
Team.php
您应该将public function assignments()
{
return $this->morphToMany('App\Models\Assignment', 'assignmentable');
}
表重命名为Assignment.php
,或者将所需的第三个和第四个参数添加到变形函数中。我更喜欢保持表名一致。