【问题标题】:PHP / Laravel - One Model with multiple polymorphic relationsPHP / Laravel - 一个具有多个多态关系的模型
【发布时间】:2019-04-22 16:21:28
【问题描述】:

在我的网络应用程序中,用户将能够将一些已解析的内容保存到名为 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. 文档字段
  2. 电子邮件字段

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

所以考虑下面的循环,我需要保存一些内容,这将引用特定的文档字段/电子邮件字段和特定的文档/电子邮件。

     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可以有两个多态关系?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    你可以通过替换这一行来解决这个问题:

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

    通过以下几行:

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

    【讨论】:

      猜你喜欢
      • 2018-04-15
      • 1970-01-01
      • 2021-05-13
      • 2022-12-04
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      相关资源
      最近更新 更多