Yii добавьте еще один вариант для CDbCriteria
Я относительно новичок в Yii.
Я уверен, что с сырым SQL, но все еще немного теряю, когда дело доходит до
ОРМ. Так что это может быть фиктивный вопрос.
Я получил все необходимые записи, создающие такие CDbCriteria
:
$criteria = new CDbCriteria(array(
'select' => 'sum(items) as items',
// 'condition' => 't.items > 0 and order.storage = "'Product::STORAGE_LOCAL . '"',
'condition' => 't.items > 0 and order.storage = "' . Product::STORAGE_LOCAL . '"',
'order' => 'sum(items) DESC',
'with' => array(
'product' => array(
'select' => 'code, title, producer, local_rest',
**// 'select' => 'code, title, producer, sum(local_rest) as local_rest',**
'group' => 'product.code',
)
),
'join' => 'inner join `order` `order` on `t`.`order_id` = `order`.`id`',
// 'group' => '`product`.`code`, `product`.`title`',
'group' => '`product`.`code`',
'together' => true
));
Я пытаюсь получить сумму поля local_rest
, выполняющего group by
. К сожалению, он не возвращает то, что должно быть.
Вот как я попытался построить его в CDbCriteria
:
// 'select' => 'code, title, producer, sum(local_rest) as local_rest',
.
- Не повезло.
Я могу получить его с помощью разделенного запроса как:
$sum_local_rest = Yii::app()->db->createCommand("
SELECT id,code, title, sum(local_rest) as sum_rest FROM product GROUP BY code
ORDER BY `sum_rest` DESC
");
Еще одна осторожность - в таблице продуктов есть повторяющиеся записи.
То есть мы имеем один и тот же продукт более одного раза. Но если я использую group by
, это помогает разграничить этот недостаток. Это связано с плохим дизайном БД и должно быть исправлено в будущем.
Проблема в том, что мне нужно как-то связать ее с CDbCriteria
, потому что она используется CDataProvider
и CDataProvider
используется GridView
.
Любые советы по подключению этих двух вопросов в одном CDbCriteria
?
Заранее спасибо
ИЗМЕНИТЬ
Глядя на текущие ответы, я чувствую, что мне нужно подвести итог. Основная проблема заключается в том, что мне нужно сообщить CDbCriteria
, чтобы получить записи (связанные с HAS_Many соединениями) и рассчитать СУММ всех этих записей и сделать CDbCriteria
для выполнения GROUP BY этих записей.
Другого пути нет. Я не могу это сделать явно. Поскольку я передаю CDbCriteria
в CDataProvider
, и он должен запускать запросы. Вот как все работает в Yii (насколько я понимаю).
Ответы
Ответ 1
Вам также не нужно передавать все элементы в критерии. Попытайтесь разбить критерии на следующий код следующим образом:
$criteria = new CDbCriteria();
$criteria->select = 'sum(items) as items, ' . Product::STORAGE_LOCAL;
$criteria->condition = 't.items > 0 and order.storage = ' . Product::STORAGE_LOCAL;
//etc.
Ответ 2
//You can merge your criteria like here:
$criteria = new CDbCriteria(); //First criteria
$criteria_2 = new CDbCriteria(); //Second criteria
$criteria->mergeWith($criteria_2); //Merge criteria and criteria_2
SomeModel::model()->findAll($criteria); //Find by criteria
Ответ 3
Я не понимаю, почему что-то вроде этого не должно работать:
$criteria = new CDbCriteria;
$criteria->select = array(
"SUM(t.items) as items",
"SUM(product.local_rest) as product_local_rest"
);
$criteria->condition = "t.items > 0 and order.storage = "' . Product::STORAGE_LOCAL . '"';
$criteria->join = 'inner join `order` `order` on `t`.`order_id` = `order`.`id`';
$criteria->with = "product";
$criteria->group = "product.code";
$criteria->together = true;
Поскольку вы устанавливаете together
в значение true, столбцы вашего отношения должны быть доступны для вашего запроса, сглаженные именем отношения (продуктом). (Примечание. Чтобы получить доступ к результату SUM (product.local_rest) на моделях, возвращаемых CActiveDataProvider, вам нужно установить $product_local_rest
как общедоступное свойство класса возвращаемых моделей.)
В качестве альтернативы, если вам удобнее писать исходный SQL, вы можете использовать CDbCommand для создания массива результатов, а затем использовать CArrayDataProvider вместо CActiveDataProvider. http://www.yiiframework.com/doc/api/1.1/CArrayDataProvider