在Yii2 Active Record中等效的MySQL复杂查询排序查询

时间:2019-03-04 04:12:08

标签: php mysql activerecord yii2

我需要按status字段对表数据进行排序,但我想先显示一些具有特定status的行。

目前,我可以使用MySQL这样实现:

SELECT status FROM item
ORDER BY status NOT LIKE '%order-status%',  status

因此,所有具有order-status订单状态的商品都将首先显示,然后按状态显示其他订单。

但是我无法在Yii2 Active Record中实现这一目标。我试图写类似的东西:

$query->orderBy(['not like', 'item.status', 'order-status']);
$query->orderBy(['item.status' => SORT_ASC]);

但这是不正确的。有什么方法可以在Active Record中实现?

2 个答案:

答案 0 :(得分:3)

您可以使用yii\db\Expression创建自定义order by子句。您的需求查询将是这样的:

$query->orderBy(new yii\db\Expression("status NOT LIKE '%order-status%',  status"))

Expression实例中传递的此参数将由Yii 2查询构建器直接使用。有关更多详细信息,请阅读Expression documentation

答案 1 :(得分:0)

您可以在orderBy中使用字符串,如下所示:

$query->orderBy("status NOT LIKE '%order-status%',  status");

$query->orderBy("status NOT LIKE '%order-status%'")
     ->addOrderBy('status');

有用的链接:db-query-builder