Ответы пользователя по тегу Yii
  • Yii debug кто чем пользуется?

    Hesed
    @Hesed
    Ответ на вопрос "кто чем пользуется": для первого Yii есть хороший порт дебаг-тулбара из второго: гитхаб, packagist.
    Ответ написан
    Комментировать
  • Как узнать кол-во изменённых строк в yii?

    Hesed
    @Hesed
    Критерий "on duplicate key update" есть только в MySQL (и форках) и его не шибко хорошо использовать, равно как и хардкодить SQL-запрос, когда есть DAO/AR. Если по существу, то "on duplicate key update" согласно официальной документации возвращает 1, если ряд был вставлен и 2, если обновлён. Поскольку это поведение самого MySQL, то средствами Yii это не обойти.

    Для решения задачи, я бы пересмотрел само выражение и подход к написанию запросов. Например:
    // Ищем, существует ли запись с ключом $id
    $model = MetaModel::model()->findByPk($id);
    
    // Если записи нет, мы будем делать insert
    if(!$model) {
        $model = new MetaModel();
        // Присваиваем атрибуты. Позаботьтесь о том, чтобы массив $attrs содержал их
        $model->attributes = $attrs;
        $res = $model->save();
    }
    else {
        $res = Yii::app()->db->createCommand()
            ->update('{{table}}',        // название таблицы
                array(
                    'meta_val'=>':meta', // какое поле
                ), 
                'id=:id',                // where id = ...
                array(
                    ':id' => $id,        // param binding
                    ':meta' => 'blablabla'
                )
            )
            ->execute();
    }
    
    echo intval($res).' rows affected';


    Код написан вслепую и не тестировался. Его однозначно необходимо заточить под свои нужды, я лишь предлагаю свой вариант. Более громоздко? Да, но мы:
    • избавляемся от привязки к MySQL;
    • от довольно пагубной привычки писать "чистый" SQL, когда в нашем распоряжении есть такие инструменты, как ActiveRecord и конструктор запросов
    • приучаемся использовать param binding, что, впрочем, не избавляет от необходимости sanitize'ить данные


    P.S. Это решение "в лоб", требующее минимально менять существующий код. По-хорошему, конечно, такие задачи надо решать до запроса на уровне сценариев. Или навешивать behavior.
    Ответ написан
    3 комментария