残念ながら、前に述べたように、これには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)