我想通过Yii 1.15 ORM运行一个简单的SQL
查询。
SQL语法
SELECT ( sum(last_question) - count(last_question) ) as data
FROM tbl_game
WHERE last_question <> 0
我的问题是
Yii方式做什么会更好?
如果使用Yii,还可以以整数值而不是CModel Object返回吗?
更新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
答案 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))
。
答案 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
并获得一个整数。