【问题标题】:Laravel self based polymorphic relationshipLaravel 基于自的多态关系
【发布时间】: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
  • 哦,算了,现在我明白你要做什么了

标签: laravel eloquent relationship laravel-8 eloquent-relationship


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 2014-07-24
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多