If Exists Update Else Insert

Привет, друзья. В таблице есть уникальный ключ, который формируется из других реквизитов модели перед ее записью. Соответственно, если такой ключ в базе существует (или модель с такими реквизитами), нужно обновлять существующую запись, если нет, то вставлять эту запись в базу.

Проблема тривиальна, но везде мне встречалось решение в духе:


$model = Transactions::model()->find( "uuid = :uuid",array(':uuid'=>$uuid_string) ); 

if ($newTransaction == null) {

$newTransaction = new Transactions;

}

В моем конкретном случае решать проблему таким способом очень неудобно. Нет ли способа решить эту задачу через rules() или другими настройками модели?

Спасибо.

Вызвать updateByPk(…), глянуть на результат, если обновилось ноль записей - делаете инсерт вторым запросом.

Примерную реализацию можно глянуть в update():

http://www.yiiframework.com/doc/api/1.1/CActiveRecord#update-detail

Обратите внимание, что Вам самостоятельно придется разгребать валидацию и хуки.

Не могу сказать, что это дает какой-то профит, поскольку вобоих вариантах Вам придется исполнять два запроса:

в первом SELECT + INSERT/UPDATE, во втором - UPDATE + INSERT.