我有自定义shipmentable_type的问题。我的结构看起来像这样:
transfers:
id - integer
name - string
shipment:
id - integer
name - string
shipmentale:
shipment_id - integer
shipmentable_id - integer
shipmentabl_type - enum ( transfer, order, complaint, internet )
现在,我的Transfer模型就像这样:
public function shipments()
{
return $this->morphToMany(Shipment::class, 'shipmentable');
}
问题是,对于可装运的表格,到loading装运货物类型现在就像这样:App / Models / Transfer,但我想强行去那里'转移'在这种情况下。可能吗?
答案 0 :(得分:3)
要设置shipmentable_type
中模型的完全限定名称以外的值,有Relation::morphMap()
功能。
Relation::morphMap([
'transfer' => 'App/Models/Transfer'
]);
应在AppServiceProvider
或类似内容中设置。
答案 1 :(得分:3)
来自docs
默认情况下,Laravel将使用完全限定的类名来存储相关模型的类型。但是,您可能希望将数据库与应用程序的内部结构分离。在这种情况下,您可以定义关系“变形图”以指示Eloquent为每个模型使用自定义名称而不是类名:
use Illuminate\Database\Eloquent\Relations\Relation;
Relation::morphMap([
'transfer' => 'App/Models/Transfer'
]);
您可以在morphMap
的{{1}}功能中注册boot
,也可以根据需要创建单独的服务提供商。
答案 2 :(得分:0)
我遇到了这个问题,但不幸的是,我有多个指向transfer
且具有多个位置的模型。您可以在模型上动态解析它们:
class Transfers extends Model
{
/**
* Declare the class to get connect polymorphic relationships.
*
* @var string|null
*/
protected $morphClass = null;
/**
* Get the associated morph class.
*
* @return string|null
*/
public function getMorphClass()
{
return $this->morphClass ?: static::class;
}
public function shipments()
{
$this->morphClass = 'transfer'
return $this->morphToMany(Shipment::class, 'shipmentable');
}
// ...
}