@flammerman
Web Developer / И фронт и сервер

Yii. Каким образом лучше сделать insert через одну форму сразу в несколько таблиц в БД?

Всем доброго времени суток.

Ситуация такая.
Есть 3 таблицы: сущности товаров (id, name), варианты товаров(id, product_id, size, color, count), изображения (id, product_id, image_full_path). Это примерный список, полей в каждой таблице чуть больше, но для демонстрации думаю этого достаточно. Последние 2 таблицы связаны с первой по полю "product_id" и в моделях прописаны, соответственно, все необходимые relations. Они проверены, при ручном добавлении в MySQL выводы(всякие view) работают прекрасно. Проблема в вводе =).

Возник вопрос, как наиболее правильно со стороны Yii добавить все эти поля одновременно за одно нажатие кнопки "сохранить" в одной форме, чтобы не городить велосипеды или костыли.

Я не прошу расписывать полностью весь код и все делать за меня. Важен сам принцип или мб. полезную ссылку или, если есть, пример.

Сам я вроде как склоняюсь к способу при успешном добавлении сущности товара получить ее id и дальше разбирать данные POST других групп полей формы (варианты товара и изображения товара). Все в 1 экшен с названием "add". Не знаю, правильно ли это или нет. Помогите разобраться. Заранее спасибо всем.
  • Вопрос задан
  • 165 просмотров
Пригласить эксперта
Ответы на вопрос 2
@olegf13
Можно сделать отдельный экшн контроллера с примерно следующим:
<?php
$dbTransaction = $Yii::app()->db->getCurrentTransaction();
if (!$dbTransaction) {
	$dbTransaction = Yii::app()->db->beginTransaction();
}

$productModel = new Product;
$productModel->attributes = $prodAttrs;
if (!$productModel->save()) {
	$dbTransaction->rollback();
	throw new CException("some");
}

foreach ($productModes as $productModeAttrs) {
	$productModeModel = new productMode;
	$productModeModel->attributes = $productModeAttrs;
	$productModeModel->product_id = $productModel->id;
	if (!$productModeModel->save()) {
		$dbTransaction->rollback();
		throw new CException("some");
	}
}

// похожее с фото товаров

$dbTransaction->commit();

// redirect/render/return метода контроллера
Ответ написан
Комментировать
@flammerman Автор вопроса
Web Developer / И фронт и сервер
А заворачивать это в транзакцию обязательно?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы