Laravel 多态关系问题
Laravel Polymorphic Relationships Issue
我正在尝试利用 Laravel 的多态关系
我正在构建一个应用,其中有 3 个 table:products
、expenses
和 hunts
。
每个产品、费用或狩猎都属于一个类别。我曾经有 3 个不同的 tables product_categories
、expenses_categories
和 hunts_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();
然后在您的 product
、expenses
和 hunts
上有一个 category_id
列:tables:
$table->foreignId('category_id')->constrained();
您的每个 Product
、Expense
和 Hunt
模型都有一个 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_type
和 notable_id
列,然后在 Product
上使用 morphOne
和 Expense
型号。
我正在尝试利用 Laravel 的多态关系
我正在构建一个应用,其中有 3 个 table:products
、expenses
和 hunts
。
每个产品、费用或狩猎都属于一个类别。我曾经有 3 个不同的 tables product_categories
、expenses_categories
和 hunts_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();
然后在您的 product
、expenses
和 hunts
上有一个 category_id
列:tables:
$table->foreignId('category_id')->constrained();
您的每个 Product
、Expense
和 Hunt
模型都有一个 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_type
和 notable_id
列,然后在 Product
上使用 morphOne
和 Expense
型号。