PHP / Laravel - одна модель с несколькими полиморфными отношениями - PullRequest
2 голосов
/ 22 апреля 2019

В моем веб-приложении пользователи смогут сохранять проанализированный контент в таблицу с именем 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. Электронные письма

В моих моделях DocumentField и EmailField я определил это соотношение:

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

И в моих моделях Document и Email я определил это:

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 morph:

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 голосов
/ 22 апреля 2019

Вы можете решить эту проблему, заменив эту строку:

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

По следующим строкам:

$field->result()->create([
  'content' => $content,
  'typeable_id' => $document->id,
  'typeable_type' => get_class($document),
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...