YiiFramework Yii2 транзакции

Vano

Новичок
Может кто сталкивался, ато не могу найти в документации. Если я в одном action изменяю записи разных таблиц, как бы это все завернуть в транзакцию? Таблицы связаны по ключу user_id. Наверное, просто еще не научился искать по документации или пока слабоват в ООП) Помогите пожалуйста, может кто видел в документации как правильно это делать?
 

Vano

Новичок
Может мне понадобится как-то связать модели, чтобы потом одним сценарием делать как-то) В общем подскажите как правильно это делать, ну или если вы стыкались в документации дайте ссылку плз)
 

Vano

Новичок
А ну и в точности задача: Есть таблица Helpdesk (Тех Поддержка) ticket_id | blablabla | bla | bla | answered|. Поле answered означает ответил ли админ на сообщение. Есть таблица Answers, (ответы на заданный вопрос в техподдержке) answer_id | ticket_id | bla | bla. И вот когда админ отвечает в таблице Helpdesk ставлю answered 1. А когда пользователь "доспрашивает" обратно ставлю answered 0; Для этого использовал beforeSave(). Но как это действие обернуть в транзакцию? Чтоб правильно и красиво было
 

Vano

Новичок
Практически по всем ссылкам - милейшие советы все это делать прямо в контроллере.

Поубывыв бы.
Во во, ну я пока тут мне отвечали уже прошарил. в Моделе functtransactions () { 'имя-сценария' => 'запрос' }. Только вот не успел протестить, если я в эту модель добавлю АфтерДелет и еще чтото удалю, то транзакция точно будет распостраняться на АфтерДелет (если удаляю другой моделью)?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
вам, блин, про транзакции, или про архитектуру приложения?
в доке по file() пример форматирования вывода рядом с чтением из файла - вы так и пишете?

а еще я не читаю неотформатированные сообщения вроде
А ну и в точности задача: Есть таблица Helpdesk (Тех Поддержка) ticket_id | blablabla | bla | bla | answered|. Поле answered означает ответил ли админ на сообщение. Есть таблица Answers, (ответы на заданный вопрос в техподдержке) answer_id | ticket_id | bla | bla. И вот когда админ отвечает в таблице Helpdesk ставлю answered 1. А когда пользователь "доспрашивает" обратно ставлю answered 0; Для этого использовал beforeSave(). Но как это действие обернуть в транзакцию? Чтоб правильно и красиво было
если автору лень писать так, чтобы было удобно читать - мне лень это читать
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
Ну вот дока php уж явно не пример, там почти в каждой функции гавнокод)
 

Vano

Новичок
та да проверю уже завтра
Именно так как говорил.
Если в моделе определить функцию transactions,
Код:
public function transactions()
    {
        return [
            'scenario' => self::OP_ALL,
        ];
    }
То все запросы в БД, которые выполняться этой моделью со сценарием 'scenario', будут обернуты в транзакцию. Даже в случае, если вы используете запросы других моделей, к примеру в триггере afterSave() .
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я перечитал последнее сообщение 3 раза и не смог понять о чем оно
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
да, туплю, простите!

через метод transactions() получается совершенно непредсказуемая хрень в худших кетайских традициях с гарантией выстрела в ногу, ибо о поддержке вложенных транзакций речи нет, тем более во всех БД.
Если мы сделаем транзакцию в модели - через некоторое время надо будет вызвать модель в ситуации, когда транзакция уже запущена. Даже при условии, что фреймворк это отследит - получается, что модель в разном окружении ведет себя по-разному, и есть шанс ловить баги со внезапным преждевременным коммитом.

Если транзакции нужны - их надо планировать комплексно на уровне проектирования приложения в целом.
Только ручками.
http://www.yiiframework.com/doc-2.0/guide-db-dao.html#transactions
Я делаю специальный класс-обертку, который начинает транзакцию, вызывает нужные методы моделей, коммитит или откатывает по ситуации. Для каждого действия контроллера - свой метод или даже отдельный класс.
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Redjik, в принципе, сейвпоинты реализованы, но с транзакциями все-равно надо работать в специальном классе, а не в самой модели;

чтобы писать в модели - необходимо чтобы все разработчики, настоящие и будущие, знали поддержку сейвпоинтов в yii 2, соглашения и константы, т.е. можно если проект личный
 
Последнее редактирование:
Сверху