Yii2中的按字段排序

时间:2015-03-04 14:08:48

标签: yii2

我遇到了这个问题,并没有找到yii仪器的任何解决方案。有人知道如何解决这个问题吗?

最终,我使用了这个糟糕的代码

$params = [];
foreach ($recipeIds as $i => $recipeId) {
    $params[':id_'.$i] = $recipeId;
}

$recipes = Recipes::findBySql(
        'SELECT
            *
        FROM
            {{%recipes}}
        WHERE
            `id` IN ('.implode(', ',array_keys($params)).')
        ORDER BY
            FIELD (id, '.implode(',', array_reverse(array_keys($params))).')
        LIMIT
            :limit',
        $params + [':limit' => $this->count]
    )
    ->all();

如何解决:: find()?

UPD:应该像

$recipes = Recipes::find()
    ->where(['id' => $recipeIds])
    ->orderBy(['id' => array_reverse($recipeIds)])
    ->limit($this->count)
    ->all();

2 个答案:

答案 0 :(得分:21)

试试:

$recipes = Recipes::find()
    ->where(['in', 'id', $recipeIds])
    ->orderBy([new \yii\db\Expression('FIELD (id, ' . implode(',', array_reverse(array_keys($params))) . ')')])
    ->limit($this->count)
    ->all();

使用orderByFIELD (...)一起使用时请参阅https://github.com/yiisoft/yii2/issues/553

答案 1 :(得分:0)

虽然这是一个老问题,但今天我遇到了完全相同的问题,下面是我的解决方案,因此它可以帮助任何面临相同问题的人。

解决方案:

  • 不要使用$this->hasMany,而是使用ActiveQuery
  • 在查询中使用属性 $multiple 来指示此查询将返回一个结果数组。
  • 使用leftJoin方法,并在其中定义连接表关系。

示例:

public function getValues()
{
$query = Value::find()
->leftJoin(ItemHasValue::tableName(), ItemHasValue::tableName() . '. value_id = ' . Value::tableName() . '.id' )
->where([
// define all ur conditions here
])
$query->multiple = true;

return $query;
}

P.S 请参阅 Yii Github 问题跟踪器 https://github.com/yiisoft/yii2/issues/17166

上的此链接