php - 为什么 Yii Query Builder 忽略 offset()?

标签 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 会吐出这一行吗?

最佳答案

这是查询生成器的问题。您需要一个特定的顺序,绑定(bind)值应该在查询结束时完成。

这是因为 Yii 在绑定(bind)值时做了一个准备语句。然后缓存这条语句。然后你附加你的订单并限制它。当你做查询时,使用以前缓存的语句,没有顺序和限制。我认为这是设计使然。

所以总是最后绑定(bind)值:

$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();

关于php - 为什么 Yii Query Builder 忽略 offset()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24935806/

相关文章:

MYSQL生日查询

mysql - sql查询从mysql中选择记录

php - 将 yii 默认用户名字段更改为电子邮件字段以进行登录

php - 在 Yii CDbCriteria 语句中使用 CASE

php_oci8_11g.dll 不是有效的 Win32 应用程序

php - 在php中的数据库中设置 session

mysql - 如何在运行 SQL Update 语句之前对其进行测试?

javascript - jquery 选择器 "is not a function",可能与包含脚本有关

php - 如何使用 HttpUrlConnection 通过 POST 传递参数

php - 如何使用 PHP 的 PDO 强制创建新的数据库连接来连接 MySQL