我有一个非常基本的 Yii2 ActiveRecord 查询。
$paperList = Paper::find()->orderBy(['id' => SORT_DESC])->all();
id 是我的主键列,其类型为 int 和 AUTO_INCRMENT。 当直接在 MySQL 上运行简单的
select * from paper order by id desc
时,它工作得很好,我得到一个列表,例如:18,17,16
但是当运行上面的 Yii2 代码时,它保持顺序为 16,17,18
在更大的桌子上,它似乎也排序得很奇怪。它将返回:100, 101, 102, 20, 21
但应该返回:102, 101, 100, 21, 20
如果我在代码中使用带有标准 SQL 的查询生成器,那么它就不再是 ActiveRecord。
您的代码看起来正确。
据我所知可能的问题:
冲突的逻辑或范围,如果您在模型中定义了自定义范围或过滤器,它们可能会覆盖 orderBy 子句。
查询缓存 - 如果启用查询缓存,结果可能来自缓存,而不反映正确的顺序。
尝试这种方法 - 如果您使用 GridView 或类似的数据呈现,请使用 ActiveDataProvider 来管理查询:
use yii\data\ActiveDataProvider;
$dataProvider = new ActiveDataProvider([
'query' => Paper::find()->orderBy(['id' => SORT_DESC]),
]);
如果没有帮助,请尝试检查调试工具栏以确认生成的 SQL 查询包含 ORDER BY 子句。