Сложный запрос

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Evgeniy57
Сообщения: 6
Зарегистрирован: 2014.09.06, 22:40

Сложный запрос

Сообщение Evgeniy57 »

У меня есть необходимость вставлять сразу в 5 таблиц и в 3 из них возможно по несколько записей сразу (благо такие запросы будут крайне редко, не каждый день даже).

Пускай это будут таблицы A, B, C, D, E.

Для удобства создал метод. Но доделывать его я не стал, так, как понял, что так просто все не пройдет.

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

private function create($model, $data = array()) {
            $model->attributes = $this->arr;

            if (!$model->validate()) {
                echo CHtml::errorSummary($model);
            }
            $model->save();
            return $model->id;
}

Сначала вставляем в таблицу A, и нам нужно получить ид вставленной записи для следующего запроса. Выполняем запрос B и тоже получаем ид.

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

$client_id = $this->create($clients_model);
$journal_id = $this->create(new JournalParking, array('client_id' => $client_id));
Тут было все легко, следующие таблицы сложней.
В таблицы C и D мне нужно иметь возможность вставить туда по несколько записей и занести идшники этих записей в таблицу E. То есть если в таблицу C вставлю две записи, а в D три, то в E нужно будет вставлять пять записей.

Если бы не требовались ид вставленных записей то, конечно, я бы просто сгенерил sql строку и одним запросом все это сделал, но вот как сделать так, что бы с ид и грамотно я не знаю. Не в цикле же запросы гонять. Или раз такие запросы будут очень редко, то не стоит запариваться на счет оптимизации?

Подскажите, пожалуйста, буду очень благодарен.
Evgeniy57
Сообщения: 6
Зарегистрирован: 2014.09.06, 22:40

Re: Сложный запрос

Сообщение Evgeniy57 »

Может надо все-таки генерировать sql строку и сразу как-то этим же запросом возвращать идшники? а потом на основе этого результата вставлять уже дальше?
Получается 4 запроса (можно, наверное по этому принципу и первые два объединить). Уже лучше, чем, возможно, будет под десяток.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Сложный запрос

Сообщение zelenin »

у вас yii2 или yii1 все-таки?

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

$ids = array();
foreach ($cRecords as $cRecord) {
// ... вставляем в таблицу C
$ids[] = $cId; // заносим в массив id
}
// повторяем для D

// массив id вносим одним запросом в E
 
Evgeniy57
Сообщения: 6
Зарегистрирован: 2014.09.06, 22:40

Re: Сложный запрос

Сообщение Evgeniy57 »

zelenin писал(а):у вас yii2 или yii1 все-таки?

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

$ids = array();
foreach ($cRecords as $cRecord) {
// ... вставляем в таблицу C
$ids[] = $cId; // заносим в массив id
}
// повторяем для D

// массив id вносим одним запросом в E
Yii 1.1.14 у меня
Это очевидное решение, я уже писал о нем, но оно будет слишком "тяжелым". То есть, если в C и D надо три записи вставить, то это будет 8 запросов, я хотел это как-то сжать.
Самый верный вариант, мне кажется, это хранимые процедуры. Если все сделать, как нужно, то все получится вообще одним запросом сделать. Но у хранимых процедур свои минусы есть. Как думайте?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Сложный запрос

Сообщение zelenin »

а вы написали в ветку yii2.

Если в C и D вставить двумя запросами, то не сможете получить id вставленных записей, насколько я понимаю.
Ответить