Laravel 多态关系问题

Laravel Polymorphic Relationships Issue

我正在尝试利用 Laravel 的多态关系

我正在构建一个应用,其中有 3 个 table:productsexpenseshunts

每个产品、费用或狩猎都属于一个类别。我曾经有 3 个不同的 tables product_categoriesexpenses_categorieshunts_categories 但我不喜欢这样做所以我做了一些研究并发现关于这个 Polimorphic Relationships 的东西,但我不太确定如何使用它。

我创建了一个新的 category table,其中包含以下列

$table->id();
$table->string('name');
$table->integer('categorizable_id');
$table->string('categorizable_type');
$table->foreignId('icon_id')->constrained();

我的模型看起来像

class Product extends Model
{
    public function category () {
        return $this->morphOne(Category::class, 'categorizable');
    }
}

class Expense extends Model
{
    public function category () {
        return $this->morphOne(Category::class, 'categorizable');
    }
}

class Hunt extends Model
{
    public function category () {
        return $this->morphOne(Category::class, 'categorizable');
    }
}

class Category extends Model
{
    public function icon () {
        return $this->belongsTo(Icon::class);
    }

    public function categorizable () {
        return $this->morphTo();
    }
}

我只想要 expenses table 的 5 个类别,所以我将它们直接播种到数据库,但产品类别和搜索类别是由用户创建的

在我的 CategorySeeder.php 文件中,我有以下函数

public function run()
    {
        DB::table('categories')->insert([
            ['name' => 'Advertising', 'icon_id' => 1, 'categorizable_id' => ?, 'categorizable_type' => 'App\Models\Expense'],
            ['name' => 'Utilities', 'icon_id' => 2],
            ['name' => 'Shopping', 'icon_id' => 3],
            ['name' => 'Payroll', 'icon_id' => 4],
            ['name' => 'Other', 'icon_id' => 5]
        ]);
    }

因为在产生任何费用之前我想要这些类别。我应该如何处理 categorizable_id 列?

您不需要为此使用多态关系。你可以简单地有一个类别 table:

$table->id();
$table->string('name');
$table->foreignId('icon_id')->constrained();

然后在您的 productexpenseshunts 上有一个 category_id 列:tables:

$table->foreignId('category_id')->constrained();

您的每个 ProductExpenseHunt 模型都有一个 category 方法:

public function category()
{
    return $this->belongsTo(Category::class);
}

然后你的 Category 模型可能是这样的:

public function products()
{
    return $this->hasMany(Product::class);
}

public function expenses()
{
    return $this->hasMany(Expense::class);
}

public function hunts()
{
    return $this->hasMany(Hunt::class);
}

如果您有一个 Note 模型,多态关系将很有用,例如,它可能属于产品或费用。在这种情况下,您将在 notes table 上使用 notable_typenotable_id 列,然后在 Product 上使用 morphOneExpense 型号。