我对Yii比较陌生。

我对原始SQL充满信心,但是在涉及到
ORM。因此,这可能是一个虚拟的问题。

我已经检索了构建此类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
");

还有一点要注意-产品表中有重复的记录。
IE。我们拥有同一个产品不止一次。但是,如果我使用GROUP BY,则有助于消除此缺陷。这是由于数据库设计不佳而引起的,应在将来修复。

问题是我需要某种方式将其与CDbCriteria绑定(bind),因为它由CDataProvider使用,而CDataProviderGridView使用。

任何提示如何将这两个问题连接在一个CDbCriteria中?

提前致谢

编辑

看目前的答案,我觉得我需要总结一下。主要问题是我需要告诉CDbCriteria检索记录(由HAS_Many连接绑定(bind))并计算所有这些记录的SUM,并使CDbCriteria进行这些记录的GROUP BY。
别无退路。我不能明确地做到这一点。因为我将CDbCriteria传递给CDataProvider,所以它应该运行查询。据我所知,这就是Yii中的工作方式。

最佳答案

您也不必将所有元素都传递给条件。尝试将条件分成更多这样的代码:

 $criteria = new CDbCriteria();
 $criteria->select = 'sum(items) as items, ' . Product::STORAGE_LOCAL;
 $criteria->condition = 't.items > 0 and order.storage = ' .  Product::STORAGE_LOCAL;

//etc.

关于php - Yii再添加一个选择到CDbCriteria,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30183999/

10-09 23:54