Мультимодельный импорт данных MVC (толстая модель?) - PullRequest
0 голосов
/ 20 сентября 2010

Я занимаюсь разработкой приложения, в котором необходимо будет импортировать данные для трех моделей из одного файла CSV (с ассоциациями «один ко многим»).Я настроил модель и контроллер Datafile для обработки загрузки / анализа файла.Прямо сейчас вся логика анализа и сохранения записей находится в контроллере.Это позволяет мне сохранять в нескольких разных моделях, получать идентификаторы для сохраненных записей и создавать ассоциации по мере необходимости во время анализа файла.

Подумав о принципе «толстая модель, тощий контроллер», я понялУ меня около 150 строк кода в контроллере, который на самом деле просто обрабатывает данные.Когда я начал смотреть на перемещение этого в модель, я пришел к выводу, что мне придется обрабатывать все эти данные в массивах (без знания идентификаторов ассоциации) и отправлять их обратно в контроллер для сохранения (так как модель не можетвызов методов из других моделей).Я ожидаю около 1500 записей в файле импорта.Я использую CakePHP, у которого есть метод saveAll() для сохранения данных на нескольких моделях одновременно из одного массива.

Другой вариант - каждая из трех моделей отдельно анализирует файл, игнорируя любые данные.это не нужно.Это должно быть возможно, пока я отправляю его моделям в правильном порядке и даю моделям "ownTo" список возможных связанных записей для поиска.

Итак, есть ли какие-либо рекомендации по этим параметрам?

  1. Оставьте код синтаксического анализа в контроллере Datafile как есть.
  2. Переместите весь код синтаксического анализа в модель Datafile, затем передайте обратно большой массив для сохранения через контроллер Datafile.
  3. Отправьте файл отдельно для каждой из трех моделей вместе с дополнительными списками для определения ассоциаций.

Ответы [ 3 ]

1 голос
/ 21 сентября 2010

Для сценариев импорта я всегда предпочитаю сценарий оболочки.Контроллер, вероятно, является наихудшим из возможных мест для установки сложной логики импорта, поскольку его практически невозможно использовать повторно.

Если у вас нет проблем с запуском сценария из CLI, используйте Shell .Вы даже можете вызвать его из веб-интерфейса, если это необходимо.
В противном случае поместите логику в модель, чтобы иметь возможность вызывать ее как из Интернета, так и из интерфейса командной строки.

1 голос
/ 22 сентября 2010

Я построил что-то похожее на это, однако это не было специфичным для модели. Это позволяет загружать и загружать листы CSV, которые используют несколько моделей на одном листе. Я использовал ряд компонентов, которые назывались моделями, которые я хотел загрузить в виде листов CSV.

У меня есть компонент rawdata, который обрабатывает файлы построчно. В каждой строке он выполняет обратный вызов для контроллера для before_process_row и after_process_row и т. Д. Затем обратный вызов контроллера вызывает другой компонент для объединения данных в разные модели на основе правил.

Единственная информация, которую я имею в моделях, - это правила отображения полей в файле csv, информация заголовка файла и другие критерии поиска.

Это может быть немного сложнее, чем вы ищете, но я пошел с компонентами для обработки данных.

0 голосов
/ 21 сентября 2010

Это операция, которая будет выполнена только один раз? Если это так, напишите скрипт для этого. В противном случае ....

Я бы импортировал все данные в основной контроллер, построил массив данных (в том же формате, что и $this->data, затем сохранил бы его либо с saveAll, либо с отдельным save в зависимости от того, что более подходит. Пока это сохраняется с правильными отношениями, не имеет значения, как вы это делаете!

Не забудьте сделать $this->myModel->create() перед каждым, чтобы убедиться, что у вас не будет только один ряд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...