Laravel 基于自的多态关系

Posted

技术标签:

【中文标题】Laravel 基于自的多态关系【英文标题】:Laravel self based polymorphic relationship 【发布时间】:2021-07-20 19:04:36 【问题描述】:

我有 3 张桌子:

categories admins users

类别可以创建用户和管理员。在categories 表中我有morphs 字段:

$table->nullableMorphs('userable');

Category 模型中的关系:

public function userable()

    return $this->morphTo();


public function user()

    return $this->morphOne(self::class, 'userable');

但是当我尝试这样做时:

$category = Category::first();
$user = User::first();

$category->user()->save($user);

收到错误消息:

Illuminate\Database\QueryException 并带有消息“SQLSTATE[42S22]: 未找到列:1054“字段列表”中的未知列“userable_id” (SQL:更新users设置userable_id=1,userable_type= 应用\模型\类别,users.updated_at = 2021-04-27 12:13:22 其中 id = 1)'

如何在 laravel 中正确创建自变形关系?

【问题讨论】:

你能告诉我们你的迁移吗? 类别表迁移? @SpaceDogCS 哦,算了,现在我明白你要做什么了 【参考方案1】:

所以我认为你应该做的是将你添加到类别中的关系用户添加到 User 模型和 Admin 模型中,那些具有这种关系的模型可以变形到类别中

class User 
    ...

    public function user() 
        return $this->morphOne(Category::class, 'userable');
    

    ...



class Admin 
    ...

    public function user() 
        return $this->morphOne(Category::class, 'userable');
    

    ...

所以你可以这样做你的逻辑

$category = Category::first();
$user = User::first();

$user->user()->save($category);

它会使用 userable_type beeing App\Models\User 和 userable_id beeing 1 或任何用户 ID 来更新您的类别记录

id name userable_type userable_id
1 Category Test App\Models\User 1

为了让事情变得更容易,您可以创建一个特征并将该关系添加到特征中

trait IsUserable 

    public function user() 
        return $this->morphOne(Category::class, 'userable');
    


而不是添加到 User 和 Admin 模型的关系,您只需使用 trait 来代替

class User 
    use IsUserable;



class Admin 
    use IsUserable;

【讨论】:

以上是关于Laravel 基于自的多态关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 一对多(多态)关系

如何在laravel中获得多态关系?

Laravel-多对一多态关系

Laravel 5分离/删除多态关系

Laravel - 渴望加载多态关系的相关模型

Laravel - 反向多态关系