Yii createCommand 不返回正确的结果

Yii createCommand not not returning correct results

我正在尝试从带有特定 visiblity=2 子句的 table 中获取随机 ID,但我在获取 return 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) {

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

   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;

您可以使用 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() 是一个缓慢的解决方案。 Check alternatives.
另外,如果你没有从数据库中得到任何条目,你必须检查这种情况:

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