たとえば、公開のステータス(新規、モデレート、アーカイブ)を含むブログ投稿テーブルがあります。
ステータスが「モデレーション」の投稿が最初になるエンティティを取得するにはどうすればよいですか?
PHPとカスタムソートでこの問題を解決できることはわかっていますが、Doctrine 2でこれを行うにはどうすればよいですか?
たとえば、公開のステータス(新規、モデレート、アーカイブ)を含むブログ投稿テーブルがあります。
ステータスが「モデレーション」の投稿が最初になるエンティティを取得するにはどうすればよいですか?
PHPとカスタムソートでこの問題を解決できることはわかっていますが、Doctrine 2でこれを行うにはどうすればよいですか?
カスタム DQL 関数を実装できます。これは、MySQL のorder by field
機能で動作する可能性のあるものの例です。
class CustomOrder extends FunctionNode
{
public $field = null;
public $customerOrder = null;
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->field = $parser->StringPrimary()
$parser->match(Lexer::T_COMMA);
$this->secondDateExpression = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return 'FIELD(' .
$this->field->dispatch($sqlWalker) . ', ' .
$this->customOrder->dispatch($sqlWalker) .
')';
}
}
Order By CustomOrder('status', "'new', 'moderation', 'archive'")
DQL クエリで次のように呼び出します。
多くの場所でカスタム オーダー関数を再利用しない限り、PHP でカスタム ソートを実行することは、ユース ケースにも同様に有効であると思います。