gpt4 book ai didi

laravel - 与主数据的多态关系

转载 作者:行者123 更新时间:2023-12-05 08:51:37 25 4
gpt4 key购买 nike

我想解决以下问题:

我有多个模型,例如:

  • 产品
  • 客户

每个模型都应该能够有一个或多个带有数据透视表的字段

字段:

  • id
  • 标题
  • 类型
  • 需要

示例:

Product 有一个名为 video_url 的字段,type 应该是 string 包含 pivothttp://youtube.com/...

Customer 有一个名为 external_id 的字段,type 应该是 integer 包含 pivot242

字段应由用户动态添加。用户应该能够决定该字段是变形为 Product 还是 Customer(或者更晚的)。

也许这有助于理解:

enter image description here

我现在在做什么

目前我为每个创建了一个新模型,productcustomer

对于客户:

class CustomerField extends Model
{
/**
* @return \Illuminate\Database\Eloquent\Relations\belongsToMany
*/
public function customers()
{
return $this->belongsToMany(Customer::class)->withPivot('value');
}
}

对于产品:

class ProductField extends Model
{
/**
* @return \Illuminate\Database\Eloquent\Relations\belongsToMany
*/
public function products()
{
return $this->belongsToMany(Product::class)->withPivot('value');
}
}

目前这个问题解决了,但当然,这不是解决它的最优雅的方法。

我的问题

是否有可能通过额外的 pivot 将字段动态变形为 ProductCustomer

最佳答案

我想这就是你想要的Polymorphic:Many-to-Many

您不需要添加 ProductFieldCustomerField 模型,

您只需要添加ProductCustomerField 模型。

字段将动态属于产品或客户 fieldable_type。即使您有更多模型,它也会将模型名称存储到此 fieldable_type

您需要像下面这样创建表格:

enter image description here

fieldables 表有 fieldable_idfieldable_type;

fieldable_type 将自动设置您的模型名称,如 App\Product,您可以在 AppServiceProvider 中自定义:

Relation::morphMap([
'products' => 'App\Product',
'customers' => 'App\Customer',
]);

在产品模型中:

class Product extends Model
{
/**
* Get all of the fields for the product.
*/
public function fields()
{
return $this->morphToMany('App\Field', 'fieldable')->withPivot('value');
}
}

在客户模型中:

class Customer extends Model
{
/**
* Get all of the fields for the customer.
*/
public function fields()
{
return $this->morphToMany('App\Field', 'fieldable')->withPivot('value');
}
}

现场模型:

class Field extends Model
{
/**
* Get all of the products that are assigned this field.
*/
public function products()
{
return $this->morphedByMany('App\Product', 'fieldable');
}

/**
* Get all of the customers that are assigned this field.
*/
public function customers()
{
return $this->morphedByMany('App\Customer', 'fieldable');
}
}

带有枢轴值的 CRUD:

之后,您可以轻松地创建、获取、更新、删除枢轴值,例如:

Field::first()->products; # return the products with pivot value
Field::first()->customers; # return the customers with pivot value
Customer::first()->fields;

$field = Field::first();
# create new relationship with pivot value between customer and fields:
Customer::first()->fields()->attach($field, ['value' => 'customer new value field']);
# update pivot with value:
Customer::first()->fields()->sync([$field->id => ['value' => 'update customer value field']]);
# Delete pivot
Customer::first()->fields()->detach($field->id);

关于laravel - 与主数据的多态关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59437157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com