Yii createCommand未返回正确的结果


Yii createCommand not not returning correct results

我正试图从一个带有特定visiblity=2子句的表中获取一个随机ID,但我在获取它返回ID时遇到了问题,它说Undefined index: id

     $space = Yii::app()->db->createCommand()
         ->select('id')
         ->from('space')
         ->where('id=rand() AND visibility=2')
         ->limit(1)
         ->queryAll();
         //->queryRow();
     echo $space['id'];

他的方式不对吗?

我在没有访客检查的情况下,使用我原始版本中已经加载的信息找到了另一个解决方案。

    $max = Space::model()->count();
    $randId = rand(0,$max);
    $space = Space::model()->find(array('offset'=>$randId));
    if ($space->attributes['visibility'] == 2) {

您可以使用ORDER BY RAND()而不是id = rand()。您也可以使用->queryScalar()直接获取ID。

$space = Yii::app()->db->createCommand()
     ->select('id')
     ->from('space')
     ->where('visibility = 2')
     ->order('RAND()')
     ->limit(1)
     ->queryScalar();
 echo $space;

请记住,RAND()是一个缓慢的解决方案。检查备选方案
另外,如果您没有从数据库中得到任何条目,您必须检查该情况:

if (!empty($space)) { // id will never be 0
    // Do something with $space
} else {
    throw new CHttpException(404, 'No data found');
}

您在where子句中使用了随机id,因此$space可能是一个基于条件的空数组。例如,如果没有id == 3的记录,并且随机生成的id为3,则$space为空值。所以$space['id']导致Undefined index错误。你需要确保数组不是空的,然后回显数组的id:

   if($space != null)
      echo $space['id'];
queryAll方法为您提供了一个包含数据库对象的数组。为了您的目的,您可以使用更简单、更容易理解的代码:
$spaceId = Yii::app()->db->createCommand()
     ->select('id')
     ->from('space')
     ->where('visibility=2')
     ->orderBy(RAND())
     ->limit(1)
     ->queryScalar();
echo $spaceId;