【问题标题】:Yii2 OrderBy specific field value firstYii2 OrderBy 具体字段值优先
【发布时间】:2016-04-13 20:02:42
【问题描述】:

这是我的桌子:

Product
id | name
1 | A
2 | B
3 | C
4 | D

我希望 ID 3 排在第一位:

Product
id | name
3 | C
1 | A
2 | B
4 | D

我只能用“OrderBy”分配 ASC 和 DESC 值。如果你分配一个数值,它会报错。

【问题讨论】:

  • 我不确定我是否理解您的问题。您想选择此表中的行并像第二个示例中那样对它们进行排序吗?在这种情况下,“订购”标准是什么?为什么行 [3, C] 应该是第一行?

标签: mysql yii2


【解决方案1】:

使用yii\db\Expression

$orderBy = (new \yii\db\Query())
         ->select('*')
         ->from('product')
         ->orderBy([new \yii\db\Expression('FIELD (id, 3,1,2,4)')])
         ->all();

【讨论】:

  • ->orderBy([new \yii\db\Expression('FIELD (id, 3) DESC'), 'id' => SORT_ASC])
【解决方案2】:

也可以通过列的内部值进行排序,而不仅仅是 id。这在更新时会很有帮助。您更新了一个必须位于表格底部的值,因此:

->orderBy([new Expression('FIELD (column_name, value)ASC')])->all();

【讨论】:

    【解决方案3】:
    Product::find()->orderBy([new \yii\db\Expression('FIELD (id,3,1,2,4)'), 'id' => SORT_ASC])->all()
    

    【讨论】:

      【解决方案4】:

      如果你正在寻找如何使用 Yii2 对字段进行排序,试试这个

      $array_ids = [5,7,3,9,2,8,1] //simple array
      
      $modelsObj = Model::find()
              ->where(['id' => $array_ids]) // find only needed id's
              ->limit(5) //add limit if you need
              ->orderBy([new \yii\db\Expression('FIELD(id, '. implode(',', $array_ids) . ')')]) // sorting them as in array
              ->all();
      

      【讨论】:

        【解决方案5】:

        您可以将所有订单条件推送到数组中,然后将此数组放入 orderBy 方法中,如上。 ta = 枚举类型字段。

        $orderBy[] =  new \yii\db\Expression("ta = 'MALE' desc, ta = 'ALL' desc");
        $orderBy[] =  new \yii\db\Expression("id asc, name desc");
        $query->orderBy($orderBy);
        

        【讨论】:

          【解决方案6】:
          ->OrderBy("FIELD(id,3,4,2,1)");
          

          【讨论】:

            猜你喜欢
            • 2021-12-27
            • 2015-08-27
            • 2021-11-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-09
            相关资源
            最近更新 更多