Код: Выделить всё
$transaction = Yii::app()->db->beginTransaction();
Код: Выделить всё
$transaction = $Model->dbConnection->beginTransaction();
Код: Выделить всё
$transaction = Yii::app()->db->beginTransaction();
Код: Выделить всё
$transaction = $Model->dbConnection->beginTransaction();
Код: Выделить всё
$transaction = Yii::app()->db->beginTransaction();
Код: Выделить всё
$transaction = $model->dbConnection->beginTransaction();
Учитывая что транзакции применяются (чаще всего) для того, чтоб корректно выполнились n запросов, то очень часто часть запросов вообще не относятся к текущей модели, либо вообще часть запросов из построителя. Тогда логичнее опять же использовать app()->dbmc-bear писал(а):Нет это не костыль. Если работаешь с моделью, логично работать именно с ее подключением.
С подключением приложения работается на уровне приложения, компоненты там всякие.
И почему это не красиво? Очень даже красиво, читая код сразу понятно откуда база и откуда транзакция.
Если смущает dbConnection, сделай в базовой АР геттер getDb() и юзай $model->db Хотя по мне так dbConnection норма.
Все эти n-запросов будут к определнной БД, и модели все учавствующие в этой транзакции юзают одну БД, поэтому все равно из модели лучше взять. А учитывая то что в контроллере я вообще не работаю с БД то для меня ещ елогичнее в модели делать $this->getDbConnection()->beginTransaction(), и я уверен что база именна та что надо, мне не надо думать делать Yii::app()->db или Yii::app()->db1 или может Yii::app()->db100S c писал(а):Учитывая что транзакции применяются (чаще всего) для того, чтоб корректно выполнились n запросов, то очень часто часть запросов вообще не относятся к текущей модели, либо вообще часть запросов из построителя. Тогда логичнее опять же использовать app()->db
Так делать нельзя.S c писал(а):С другой стороны Yii::app()->db и Yii::app()->dbtest - тоже можно сделать некую функцию, которая выдавал нужное подключение из сессии.
Совсем? Даже не findAll()? Не придираюсь, любопытно, что эта фраза значит.mc-bear писал(а):.. А учитывая то что в контроллере я вообще не работаю с БД то ..
я что то типа этого и имел ввидуmc-bear писал(а):Но хотя перечитав условия, если БД берется из настроек пользователя, вообще-то тут логичнее при загрузке настроек (авторизация например) менять сразу главное общее соединение Yii::app()->setDb().
это все равно метод модели. так же можно и о save() рассуждатьyan писал(а):Совсем? Даже не findAll()? Не придираюсь, любопытно, что эта фраза значит.mc-bear писал(а):.. А учитывая то что в контроллере я вообще не работаю с БД то ..
mc-bear, не мог бы ты подробнее остановиться на этом моменте?Но хотя перечитав условия, если БД берется из настроек пользователя, вообще-то тут логичнее при загрузке настроек (авторизация например) менять сразу главное общее соединение Yii::app()->setDb()
понятно, видимо по человечески сложно ответить, вопрос вообще-то не про findAll был, я сам не плохо понимаю, что он может делатьmc-bear писал(а):findAll не имеет ничего общего к базе данных Это поиск моделей, модель может работать с БД, а может нет.
Почему нет? Сохранение, валидация и начало транзакции могут быть в контроллере, потому что вызывается просто метод которое это делает, а вся логика (правила валидации, логика сохранения и выполнение SQL запроса для работы транзации) не делается в контроллере.tarasnn писал(а):Я сохраняю и валидирую в контроллере (в рамках транзакции, несколько моделей), это не укладывается в парадигму MVC?
Если для конкретного пользователя используется одна база то можно юзать из конфига. Когда же у вас разные модули (модели) используют разные БД, понятно же нужно внимательно выбрать правильную базу. В данном случае не важно из какой модели будет взята база, потому что все модели внутри транзации должны иметь одну и туже БД. В контроллере могут быть несколько таких групп, тогда для каждого соединения будет своя транзакция внутри которой группа моделей.tarasnn писал(а):Не красивость с моей точки зрения заключается в том, что при $transaction = $Model->dbConnection->beginTransaction() происходит привязка к контексту подзадачи, такой код не вынести в бихейвер и не соглашусь что читать также удобно, в транзакции происходит валидирование нескольких моделей, почему именно стартовать с первой модели? а если порядок валидации поменяется?
Но это только мое мнение.
например в CWebUser::afterLogintarasnn писал(а):mc-bear, не мог бы ты подробнее остановиться на этом моменте?Но хотя перечитав условия, если БД берется из настроек пользователя, вообще-то тут логичнее при загрузке настроек (авторизация например) менять сразу главное общее соединение Yii::app()->setDb()
Код: Выделить всё
$app = Yii::app();
$app->setDb($app->user->getState('dbname') ? $app->mainDb : $app->testDb);