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