Laravel |多态关系未知列

时间:2018-05-25 20:25:16

标签: sql laravel eloquent models

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

我正在创建一个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和usersassignmentable_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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

根据您的数据结构,有两个可能的答案,但您的问题并不清楚。

  1. User / TeamAssignment是一对多的关系(每个Assignment都有一个User / {{1}每个Team / User都有Team

  2. 多对多关系,其中每个Assignments / User有多个Team,每个Assignments有多个Assignment / {{1 }}

  3. 一对多

    在一对多中,您不需要Users表格一个Teams表格,因此我假设您的Assignment是你的AssignmentAllocation模特。如果没有,那么您需要将AssignmentAllocationAssignment列放在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 TeamhasMany的第一部分说"搜索Assignments表",第二部分说"搜索morphMany _ id和AssignmentAllocation _type等于此模型的此实例"。

    2)assignmentable的行为与assignmentable类似,所以你要说:

    每个morphTo belongsToAssignment

    多对多

    但是,如果belongsTo是多对多数据透视表,而每个assignmentable都有多个AssignmentAllocationAssignment,并且每个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,或者将所需的第三个和第四个参数添加到变形函数中。我更喜欢保持表名一致。