sql - 拉拉维尔 | 多态关系未知列
问题描述
这是我第一次使用多态关系。
我正在创建一个 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
.assignmentable_type
= 应用\模型\用户
很明显我做错了什么,但是我一生都无法弄清楚我做错了什么。
这是与此相关的我的功能:
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
toAssignment
是一对多的关系(每个Assignment
都有一个User
/Team
,每个User
/Team
有很多Assignments
多对多关系,其中每个
User
/Team
有很多Assignments
,每个Assignment
都有很多Users
/Teams
一对多
在一对多中,您不需要一张Assignment
桌子和一张AssignmentAllocation
桌子,所以我假设您AssignmentAllocation
是您的Assignment
模型。如果不是,那么您需要将assignmentable_type
andassignmentable_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');
}
Team.php
public function assignments()
{
return $this->morphMany('App\Models\AssignmentAllocation', 'assignmentable');
}
您的错误是因为 Laravel 正在搜索users
表以查找匹配项(您有morphMany('User'..
),而它应该搜索AssignmentAllocation
表。所以把它们关掉。
1)morphMany
像 a 的行为hasMany
,所以你说:
每个User
hasMany
Assignment
s 和每个Team
hasMany
Assignments
. 第一部分morphMany
说“搜索AssignmentAllocation
表”,第二部分说“搜索assignmentable
_id 和assignmentable
_type 等于这个模型的这个实例”。
2)morphTo
就像belongsTo
你说的那样:
每Assignment
belongsTo
一个assignmentable
.
多对多
但是,如果AssignmentAllocation
是一个多对多数据透视表,并且每个Assignment
都有很多Users
or 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
表重命名为assignmentables
,或将所需的第三个和第四个参数添加到 morph 函数。我更喜欢保持表名一致。
推荐阅读
- python - 与Matlab比较时,python中的矩阵乘以向量是不同的
- php - 如何使用 GD 截取页面?
- python-3.x - 如何在 help() 中搜索未知函数?
- sql - 根据前一个日期计算百分比的查询
- python - 在 Cython 中使用 move 方法时出现编译错误
- python - 在 super() 上使用 **kwargs 会给我属性错误
- angular - TypeError:无法读取未定义的属性“类型”
- kotlin - 如何将 Kotlin 范围内的所有整数值相乘?
- ios - 将数据从原生 iOS 应用程序传递到 Unity 应用程序
- node.js - 即使提供了正确的详细信息,用户登录也会失败