使用YII CDbCriteria或find()方法执行此SQL的更好方法是什么?

时间:2014-09-12 11:24:16

标签: php yii

我想通过Yii 1.15 ORM运行一个简单的SQL查询。

SQL语法

SELECT ( sum(last_question) - count(last_question) ) as data 
FROM tbl_game 
WHERE last_question <> 0

我的问题是

  1. Yii方式做什么会更好?

  2. 如果使用Yii,还可以以整数值而不是CModel Object返回吗?

  3. 更新1:

    我已经尝试过这样的事情。它永远不会返回question_answered。我不知道为什么会这样做。如果CDbCriteria具有select这样的选项,那么它应该有效。

        $criteria = new CDbCriteria;
        $criteria->select    = '( sum(`last_question`) - count(`last_question`) ) as "question_answered" ';
        $criteria->condition = "last_question <> 0";
        return game::model()->find($criteria);
    

    更新2:

    这是上述标准返回模型的原始输出。此处没有question_answered

    我确信表中有记录。

    此外,我已经取代了&#34;建议使用&#39; 。它仍然没有给question_answered

    object(game)[103]
    public 'points' => null
    private '_new' (CActiveRecord) => boolean false
    private '_attributes' (CActiveRecord) => 
      array (size=0)
        empty
    private '_related' (CActiveRecord) => 
      array (size=0)
        empty
    private '_c' (CActiveRecord) => null
    private '_pk' (CActiveRecord) => null
    private '_alias' (CActiveRecord) => string 't' (length=1)
    private '_errors' (CModel) => 
      array (size=0)
        empty
    private '_validators' (CModel) => null
    private '_scenario' (CModel) => string 'update' (length=6)
    private '_e' (CComponent) => null
    private '_m' (CComponent) => null
    

4 个答案:

答案 0 :(得分:1)

我想我有一个解决方案。 您遇到的主要问题是,您要选择模型中不存在的字段('question_answered')。所以你需要做的是将这个字段添加到模型中。

模特:

class Game extends CActiveRecord {
  ...
    public $question_answered;
  ...
}

然后你可以这样做:

    $criteria = new CDbCriteria;
    $criteria->select = '(sum(`last_question`)-count(`last_question`)) as question_answered';
    $criteria->condition = "last_question <> 0";
    echo Game::model()->find($criteria)->question_answered;

每次在select子句中添加非现有字段时,都必须在模型中添加此字段。

希望这有帮助,它对我有用。

答案 1 :(得分:0)

您可以使用Query Builder

Yii::app()->db->createCommand()
    ->select('SUM(`last_question`) - COUNT(`last_question`)') // if using "()", than you have to escape columns names manualy.
    ->from('tbl_game')
    ->where('last_question != :param', [':param' => 0])
    ->queryScalar();

使用CDbCriteria,尝试这样的事情(未经测试):

$c = new CDbCriteria();
$c->select = 'SUM(`last_question`) - COUNT(`last_question`) AS "result"';
$c->addCondition('last_question != :param');
$c->params = [':param' => 0];

Game::model()->find($c)->result;

答案 2 :(得分:0)

要直接获取值而不是模型,可以使用DAO / PDO:

$sql = 'SELECT SUM(`last_question`) - COUNT(`last_question`) AS data
FROM tbl_game
WHERE last_question <> :param';
$connection = Yii::app()->db;
$command = $connection->createCommand($sql);
$value = $command->queryScalar(array(':param' => 0));

$value是第一个找到的记录。 如果你想要多个记录,你可以做一个返回数组的$values = $command->queryAll(true, array(':param' => 0))

More info here.

答案 3 :(得分:0)

您可以使用一个更整洁的选项,我不确定是否适用于您的案例。如果您有一些与 last_question 属性相关的模型,并且关系是 HAS_MANY MANY_MANY ,您可以定义 STAT 你的第一个模型中的关系,而不是任何其他关系。

public function relations()
{
    return array(
        'someVariableName'=>array(self::STAT, 'ModelNameWhichYouRelateto', 'foreignkey_attr', array(
            'select'=>'SUM(last_question) - COUNT(last_question)',
            'condition'=>'last_question <> 0'
        )),
    );
}

然后您可以使用

简单地调用它
$model->someVariableName

并获得一个整数。