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 个可能的答案,但您的问题并不清楚。

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

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


一对多

在一对多中,你不需要 Assignment table AssignmentAllocation table ,所以我假设您的 AssignmentAllocation 是您的 Assignment 模型。如果不是,那么您需要将 assignmentable_typeassignmentable_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 AssignmentsmorphMany 的第一部分表示 "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 有许多 UsersTeams,并且每个 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 名称一致。