首页 > 解决方案 > 拉拉维尔 | 多态关系未知列

问题描述

这是我第一次使用多态关系。

我正在创建一个 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哪里选择 * usersassignmentable_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');
}

任何帮助是极大的赞赏。

标签: sqllaraveleloquentmodels

解决方案


根据您的数据结构,有 2 个可能的答案,这在您的问题中并不清楚。

  1. User/ TeamtoAssignment是一对多的关系(每个Assignment都有一个User/ Team,每个User/Team有很多Assignments

  2. 多对多关系,其中每个User/Team有很多Assignments,每个Assignment都有很多Users/Teams


一对多

在一对多中,您不需要一张Assignment桌子一张AssignmentAllocation桌子,所以我假设您AssignmentAllocation是您的Assignment模型。如果不是,那么您需要将assignmentable_typeandassignmentable_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 Assignments 和每个Team hasMany Assignments. 第一部分morphMany说“搜索AssignmentAllocation表”,第二部分说“搜索assignmentable_id 和assignmentable_type 等于这个模型的这个实例”。

2)morphTo就像belongsTo你说的那样:

Assignment belongsTo一个assignmentable.


多对多

但是,如果AssignmentAllocation是一个多对多数据透视表,并且每个Assignment都有很多Usersor 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 函数。我更喜欢保持表名一致。


推荐阅读