PHP / Laravel-具有多个多态关系的模型

时间:2019-04-22 16:21:28

标签: php laravel eloquent

在我的Web应用程序中,用户将能够将一些已解析的内容保存到名为field_results的表中。

但是,此模型需要引用两个多态关系:

FieldResults.php

    // A field result morphs to either a document field or email field.
    public function fieldable()
    {
        return $this->morphTo();
    }

    // A field result morphs to either a document or email.
    public function typeable()
    {
        return $this->morphTo();
    }

fieldable是指:

  1. DocumentFields
  2. EmailFields

typeable表示:

  1. 文档
  2. 电子邮件

在我的DocumentFieldEmailField模型中,我定义了以下关系:

    // A field will have a final result.
    public function result()
    {
        return $this->morphOne(FieldResult::class, 'fieldable');
    }

在我的DocumentEmail模型中,我对此进行了定义:

public function results()
{
    return $this->morphMany(FieldRuleResult::class, 'typeable');
}

因此,请考虑下面的循环,我需要在其中保存一些内容,这些内容将引用特定的documentfield / emailfield和特定的document / email。

     foreach ($document->fields as $field) {
         $content = $field->content->text;

         //Save the content to `FieldResult
         $field->result()->create(['content' => $content]);
     }

上面只会设置fieldable变体的值:

SQLSTATE[HY000]: General error: 1364 : Field 'typeable_type' doesn't have a default value [...]

如果我将其更改为保存到文档,则会收到以下错误消息:

//Save the content to `FieldResult
 $document->result()->create(['content' => $content]);
SQLSTATE[HY000]:  General error: 1364 Field 'fieldable_type' doesn't have a default value [...]

该怎么办,所以我的模型FieldResult可以具有两个多态关系?

1 个答案:

答案 0 :(得分:0)

您可以通过替换以下行来解决此问题:

$field->result()->create(['content' => $content]);

通过以下几行:

$field->result()->create([
  'content' => $content,
  'typeable_id' => $document->id,
  'typeable_type' => get_class($document),
]);