Laravel多态与自定义外键

时间:2018-01-25 05:04:20

标签: php laravel polymorphism relationship

我有自定义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,但我想强行去那里'转移'在这种情况下。可能吗?

3 个答案:

答案 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');
    }

    // ...
}