Yii2 табличный ввод данных (tabular form)

Обсуждение документации второй версии фреймворка. Переводы Cookbook и авторские рецепты.
Ответить
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Yii2 табличный ввод данных (tabular form)

Сообщение proctoleha »

Возможно кому-то пригодится.

Итак, у нас есть мануал по работе с табличным вводом данных: https://www.yiiframework.com/doc/guide/ ... ular-input

Общий алгоритм работы с такими данными:
1. Есть какая главная модель, Model ($model) таблица model
2. Есть зависимая модель ModelEntry ($model_entry) таблица model_entry
3. К одной записи в model относятся много записей в model_entry (т.н. табличная часть)

Для массовой загрузки моделей ModelEntry в мануале рекомендуется использовать ModelEntry::loadMultiple(...)

На практике, когда мы генерируем табличную часть на лету, с ключами для массива моделей ModelEntry получается полная фигня. Как их генерировать, как принять - фиг знает.

Описывать долго - рабочий учебный пример решения проблемы с ключами для ModelEntry::loadMultiple(...) здесь: https://github.com/ale10257/learning_task

Вкратце: ключи генерируем каждый раз уникальные (uniqid()), перед сохранением в БД, если это операция update - грохаем все табличные записи, обязательно используем транзакции

Что-то типа:

Код: Выделить всё

    /**
     * @param array $post $_POST
     * @param ActiveRecord $model
     * @return array
     * @throws \yii\base\InvalidConfigException
     */
    private function getEntryArr($post, $model)
    {
        $entry_form_name = (new ModelEntry())->formName();
        $entry_arr = [];
        $keys = array_keys($post[$entry_form_name]);
        foreach ($keys as $key) {
            $entry = new ModelEntry();
            $entry->model_id = $model->id;
            $entry_arr[$key] = $entry;
        }
        MailingListEntry::loadMultiple($entry_arr, $post);
        return $entry_arr;
    }
Кому интересно - изучаем код репозитория, задаем вопросы
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Ответить