0

INステートメントでIDの順序を保持するクエリを実行しようとしています。Model ManageQueryBuilderまたは標準のORM'order'配列パラメーターのいずれでもそれを行うことができないようです。私は何かが足りないのですか?私は得続けます:

UNEXPECTED TOKEN IDENTIFIER(, NEAR TO 'id`enter code here`,17743,16688,16650

これが私のモデルマネージャーです:

$query = $this->modelsManager->createQuery('SELECT * FROM Projects WHERE id IN ('.implode(',', array_keys($finalIterations)).')
                    ORDER BY FIELD(id,'.implode(',', array_keys($finalIterations)).'');

PhQLがFIELDキーワードを好まないことは明らかです。PhQLでやろうとしていることを実行する方法はありますか?必要なことができないようです。

4

1 に答える 1

1

残念ながら、前に述べたように、これにはPhalconの機能がありません。

この関数を見てください。すべてのモデルの親クラスであるModelBase抽象クラスに入れました。PhQL変数バインディングを使用するため、ユーザーからの直接入力を安全に処理できます。

カスタムの\Phalcon\ Mvc \ Model \ Criteriaを再実装することもできますが、少なくとも私にとっては、このソリューションの方が扱いやすいようです。


ModelBase抽象

public function appendCustomOrder( \Phalcon\Mvc\Model\CriteriaInterface &$criteria, $orderField, array &$orderValues = [] ) {
    if(!empty($orderValues)) {
        $queryKeys = $bindParams = [];
        foreach($orderValues as $key => $id) {
            $queryKey = 'pho'.$key;
            $queryKeys[] = ':'.$queryKey.':';
            $bindParams[$queryKey] = $id;
        }

        // TODO: add support for multiple orderBy fields
        $criteria->orderBy('FIELD('.$orderField.','.implode(',',$queryKeys).')');
        // there's no 'addBind' function, need to merge old parameters with new ones
        $criteria->bind( array_merge( (array) @$criteria->getParams()['bind'], $bindParams ) );
    }
}

コントローラーの使用法

$projectIDs = [17743, 16688, 16650];
$projectsModel = new Projects();

$criteria = $projectsModel->query->inWhere( 'id', $projectIDs );
$projectsModel->appendCustomOrder( $criteria, 'id', $projectIDs );

$projectsData = $criteria->execute();

これにより、次のような有効なPhQL構文が生成されます。

SELECT `projects`.`id` AS `id`, `projects`.`title` AS `title` 
FROM `projects` 
WHERE `projects`.`id` IN (:phi0, :phi1, :phi2) 
ORDER BY FIELD(`projects`.`id`, :pho0, :pho1, :pho2)
于 2015-01-22T15:08:58.547 に答える