yii build query

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Закрыто
abu
Сообщения: 19
Зарегистрирован: 2011.03.17, 22:36

yii build query

Сообщение abu »

Например есть запрос вида :

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

$user = Yii::app()->db->createCommand()
    ->select('id, username, profile')
    ->from('tbl_user u')
    ->join('tbl_profile p', 'u.id=p.user_id')
    ->where('id=:id', array(':id'=>$id))
    ->queryRow();
Как добавить еще одно условие, например ->where('status=:status', array(':status'=>$status))
вариант типа :

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

$user = Yii::app()->db->createCommand()
    ->select('id, username, profile')
    ->from('tbl_user u')
    ->join('tbl_profile p', 'u.id=p.user_id')
    ->where('id=:id', array(':id'=>$id))
    ->where('status=:status', array(':status'=>$status))  
    ->queryRow();
результатов не дал, применяется последний where, а требуется where AND where AND ...
Из документации http://www.yiiframework.com/doc/guide/1 ... ry-builder не смог сделать выводов.
P.S. на синтаксичекие ошибки не смотреть интересует только логика.
Аватара пользователя
Loki
Сообщения: 65
Зарегистрирован: 2011.01.16, 10:47
Откуда: Омск

Re: yii build query

Сообщение Loki »

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

->where('id=:id AND status=:status', array(':status'=>$status, ':id'=>$id))
?
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: yii build query

Сообщение timlar »

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

. . .

->where(array(
    'and',
    'id = :id',
    'status = :status',
), array(
    ':id' => $id,
    ':status' => $status,
))

. . .
 
Twitter: @timlar_ua
abu
Сообщения: 19
Зарегистрирован: 2011.03.17, 22:36

Re: yii build query

Сообщение abu »

дело в том что количество условий может меняться, например, фильтрация товаров по критериям
если критерий не выбран, он просто не учитывается, вариант :

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

. . .

->where(array(
    'and',
    'id = :id',
    'status = :status',
), array(
    ':id' => $id,
    ':status' => $status,
))

. . .
 
не подходит т.к. предполагается что в случае когда определенный критерий не выбран нужно передавать NULL или что - то подобное (false, ''), т.е. вариант типа :

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

        
        if (!empty($model->user_id)) $user_id = $model->user_id; else $user_id = NULL;
        if (!empty($model->status)) $status = $model->status; else $status = NULL;
        if (!empty($model->payment)) $payment = $model->payment; else $payment = NULL;
        
        $all = $all->where(array(
            'and',
            'user_id = :user_id',
            'status = :status',
            'payment = :payment',
        ), array(
            ':user_id' => $user_id,
            ':status' => $status,
            ':payment' => $payment,
        ));
 
срабатывает не корректно.

Хотелось бы что - то типа такого:

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

...
        if (!empty($model->user_id)) $where .= ', user_id = "'.$model->user_id.'"';
        if (!empty($model->status)) $where .= ', status = "'.$model->status.'"';
        if (!empty($model->payment)) $where .= ', payment = "'.$model->payment.'"';
...
Для случая : user_id, status, payment = true, получаем запрос
    [_query:private] => Array
        (
            [select] => `id`, `amount`, `price`
            [from] => `{{order}}` `o`
            [where] => (user_id = :user_id) AND (status = :status) AND (payment = :payment)
        )

Для случая : user_id, status = true и payment = false , получаем запрос
    [_query:private] => Array
        (
            [select] => `id`, `amount`, `price`
            [from] => `{{order}}` `o`
            [where] => (user_id = :user_id) AND (status = :status)
        )
 
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: yii build query

Сообщение Ryadnov »

Как вариант:

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

$where = array();
$params =  array();

if (!empty($model->user_id)) {
    $where[] = 'user_id = :user_id';
    $params[':user_id'] = $model->user_id;
}
// if (!empty($model->status)) ....

if (count($where) > 1) {
    array_unshift($where, "AND");
}

// ...
->where($where, $params)
а в 1.1.13 есть addWhere
abu
Сообщения: 19
Зарегистрирован: 2011.03.17, 22:36

Re: yii build query

Сообщение abu »

спб, правда с интервалом значений пришлось повозиться, ждем 1.1.13!
Закрыто