为什么Yii QueryBuilder会忽略offset()?

时间:2014-07-24 13:57:59

标签: php mysql yii query-builder

我的查询结果是offset = 0和limit = 10正好是一行。

当我使用offset = 1时,应该没有结果。

但是有一个像

这样的查询
$query = Yii::app()->db->createCommand();
$criteria = new CDbCriteria();
$criteria->addCondition('f.deleted = 0 AND b.version = f.version');
$criteria->params = [];

if ($idUserAnswerer)
{
    $query->leftJoin('bar AS b', 'b.idF = f.id');
    $criteria->addCondition('f.idUserOwner = :idUserOwner');
    $criteria->params['idUserOwner'] = $idUserOwner;
}

$query->select('*')
    ->from('foo AS f')
    ->where($criteria->condition)
    ->bindValues($criteria->params);

$query->order('FIELD(t.type,
    ' . X::X_TYPE_ID_A . ', ' . X::X_TYPE_ID_B . ',
    ' . X::X_TYPE_ID_C . '), b.created_time, b.votes DESC');

$data = $query->limit(10, 2)->queryAll();

(提示:我必须使用$criteria,因为我必须在某个时候使用inCondition

我仍然得到这一行。但通常(当我直接在我的数据库中进行查询时)我不应该得到结果。

为什么Yii吐出这一行的任何想法?

2 个答案:

答案 0 :(得分:2)

这是查询构建器的问题。您需要特定的订单,绑定值应该在查询结束时完成。

这是因为Yii在绑定值时会执行prepare语句。然后它缓存此声明。然后您附加订单并限制它。执行查询时,将使用先前的缓存语句,而不使用顺序和限制。我认为这是设计的。

所以总是最后绑定值:

$query = Yii::app()->db->createCommand();
$data = $query->select('*')
    ->from('tbl AS t')
    ->where('idCategory=:catid')
    ->order('id DESC')
    ->limit(2, 2)
    ->bindValues(array(':catid' => 151))
    ->queryAll();

答案 1 :(得分:0)

尝试下面我希望它能起作用......

$query = Yii::app()->db->createCommand()
->select('*')->from('tblA')->limit(10,1)->queryAll();
  

参考:http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder#sec-8

编辑:

$rows = (new \yii\db\Query())
    ->select('id, name')
    ->from('user')
    ->limit(10)
    ->all();

// which is equivalent to the following code:

$query = (new \yii\db\Query())
    ->select('id, name')
    ->from('user')
    ->limit(10);

// Create a command. You can get the actual SQL using $command->sql
$command = $query->createCommand();

// Execute the command:
$rows = $command->queryAll();