Laravel 5.8 - Как правильно реплицировать () записи и их полиморфные c отношения? - PullRequest
0 голосов
/ 18 июня 2020

Схема

У нас есть приложение, которое управляет вводом данных из разных источников. Пользователи могут вводить данные в основной форме, но они также могут происходить из другой формы, которая сохраняется в отдельной таблице.
Мы отслеживаем, откуда пришли данные, с помощью необязательной связи полиморфизм c. Если установлено отношение polymorphi c, мы знаем, что нужно заблокировать ввод в основной форме и сообщить пользователям, что данные были введены из другой формы.
Данные организованы в коллекции в обоих местах (воспринимайте их как столбцы в листе Excel):

Точные имена конфиденциальны, но это базовая c схема с измененными именами:

- tasks (id, title, task_parent_id)
  - collections (id, title)
    - data (id, value, datasourceable_type, datasourceable_id)
  - collectionPants
    - pantsData (id, value)

Это не требует полиморфизма c отношения пока что, правда. Но позже у нас будет collectionShirts с shirtsData.
Вот соответствующие модели для использования в рамках обсуждения:

<?php

  class Task {}

  class Collection {}

  class Data {}

  class CollectionPants {}

  class PantsData {
    public function collectionData()
    {
      return $this->morphMany('App\Models\Data', 'datasourceable');
    }
  }

Итак, если datasourceable установлен, мы знаем, что данные приходят из pantsData в collectionPants.

Теперь реплицируйте все это

Затем мы хотим иметь возможность replicate() задачу, все ее коллекции и данные.

<?php

  class Task {
    // ...
    public function clone() {
      $task = $this->replicate();
      $task->task_parent_id = $this->id;
      $task->push();

      // ... see below
    }
    // ...
  }

Затем мы переходим к replicate () коллекциям и их данным. Это работает и в настоящее время не вызывает проблем.
Но я подумал (возможно, слишком много подумал?): Когда модель PantsData реплицируется и соответствующая модель Data также заменяется, оба их идентификатора, конечно, обновляются. Но отношение polymorphi c будет указывать на старую запись Data, если datasourceable_id также не обновляется.

Так как же?

Репликация модели Data в первую очередь означает Я должен обновить datasourceable_id позже, когда PantsData будет реплицирован. Я не могу пройти через отношения polymorphi c, потому что PantsData будет иметь новый ID после репликации.
Replicating PantsData first означает, что я не могу пересечь отношение polymorphi c обратно к Data, потому что * 1043 Идентификатор * еще не реплицирован и будет другим, когда я воспроизведу его позже.

В настоящее время я пытаюсь придумать элегантное решение, чтобы заставить эту работу работать.
Следует ли мне отслеживать каждый PantsData реплицируется и впоследствии обновляет datasourceable_id до своих новых идентификаторов?
Или Laravel имеет более элегантное решение для автоматического обновления отношений полиморфных c при репликации?
Можно ли это применить позже для копирование запланированного collectionShirts с их shirtsData без особых накладных расходов на реализацию?

Заранее спасибо!

...