Схема
У нас есть приложение, которое управляет вводом данных из разных источников. Пользователи могут вводить данные в основной форме, но они также могут происходить из другой формы, которая сохраняется в отдельной таблице.
Мы отслеживаем, откуда пришли данные, с помощью необязательной связи полиморфизм 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
без особых накладных расходов на реализацию?
Заранее спасибо!