2015-04-02 107 views
1

我想从具有特定0123'子句的表中随机获得一个ID,但我有问题要求它返回ID,它表示Undefined index: idYii createCommand不会返回正确的结果

 $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) { 

回答

0

可以使用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'); 
} 
+0

感谢伟大的解释。不过,我有一个问题,它如何可以将ID识别出来,但没有得到结果?如果它得到一个RAND()ID,它必须是一个ID?没有?我也认为'rand()'会很慢,并且使用我以前的方法找到了更好的方法。 – 2015-04-02 18:21:16

0

您使用随机ID在where子句中,因此$space也许基于条件的空数组。例如,如果您没有使用id == 3的记录,并且随机生成的ID为3,则$space是空值。因此$space['id']导致Undefined index错误。您需要确保该阵列不是空的,然后echo数组的ID:

if($space != null) 
     echo $space['id']; 
0

queryAll方法为您提供一个数据库对象的数组。 你的目的,你可以使用更简单,更易于理解的代码:

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