【问题标题】:Laravel | Polymorphic Relationship unknown column拉拉维尔 |多态关系未知列
【发布时间】:2018-11-05 06:41:08
【问题描述】:

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

我正在创建一个 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 和 users.assignmentable_id 不为空,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');
}

非常感谢任何帮助。

【问题讨论】:

    标签: sql laravel eloquent models


    【解决方案1】:

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

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

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


    一对多

    在一对多中,您不需要Assignment AssignmentAllocation 表,所以我假设您的AssignmentAllocation 是您的Assignment 模型。如果不是,那么您需要将assignmentable_typeassignmentable_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 的行为类似于 hasMany,所以你是说:

    每个UserhasManyAssignments,以及每个TeamhasManyAssignmentsmorphMany 的第一部分说“搜索AssignmentAllocation 表”,第二部分说“搜索assignmentable_id 和assignmentable_type 等于这个模型的这个实例”。

    2) morphTo 的行为类似于 belongsTo 所以你的意思是:

    每个Assignment belongsTo 一个assignmentable


    多对多

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

    【讨论】:

      猜你喜欢
      • 2022-10-14
      • 2015-04-13
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 2018-03-06
      相关资源
      最近更新 更多