Doctrine 2 mysql FIELD function en orden por

Estoy tratando de usar la función FIELD de MySQL en una cláusula order by en una consulta. Supongo que Doctrine 2 no admite la función FIELD fuera de la caja, ¿es cierto? Si es así, ¿cómo puedo usarlo? ¿Tendré que convertir toda mi consulta en una consulta nativa? ¿Hay una extensión de Doctrine 2 que agregue esta funcionalidad?

    Jeremy Hicks, gracias por tu extensión . No sabía cómo conectar tu función con la doctrine, pero finalmente encontré la respuesta.

    $doctrineConfig = $this->em->getConfiguration(); $doctrineConfig->addCustomStringFunction('FIELD', 'DoctrineExtensions\Query\Mysql\Field'); 

    Necesito la función FIELD para ordenar mis Entidades que selecciono por IN expression. Pero puede usar esta función solo en la cláusula SELECT, WHERE, BETWEEN , no en ORDER BY .

    Solución:

     $qb ->select("r, field(r.id, " . implode(", ", $ids) . ") as HIDDEN field") ->from("Entities\Round", "r") ->where($qb->expr()->in("r.id", $ids)) ->orderBy("field"); 

    Para evitar agregar alias de field en su fila de resultados, debe poner la palabra clave HIDDEN . Entonces, cómo poder ordenar valores en la expresión IN en Doctrine 2.2.

    Puede agregar soporte para la función DQL FIELD (), pero en su lugar implementarlo como SQL CASE estándar. WHEN expresión. De esta forma, su función funcionaría tanto en MySQL como en Sqlite, lo cual es particularmente útil si usted es como yo y desea ejecutar las pruebas de su unidad en sqlite en memoria.

    Esta clase se basa en gran medida en el trabajo de Jeremy Hicks (simplemente cambié el método getSql ())

     class Field extends FunctionNode { private $field = null; private $values = array(); public function parse(\Doctrine\ORM\Query\Parser $parser) { $parser->match(Lexer::T_IDENTIFIER); $parser->match(Lexer::T_OPEN_PARENTHESIS); // Do the field. $this->field = $parser->ArithmeticPrimary(); // Add the strings to the values array. FIELD must // be used with at least 1 string not including the field. $lexer = $parser->getLexer(); while (count($this->values) < 1 || $lexer->lookahead['type'] != Lexer::T_CLOSE_PARENTHESIS) { $parser->match(Lexer::T_COMMA); $this->values[] = $parser->ArithmeticPrimary(); } $parser->match(Lexer::T_CLOSE_PARENTHESIS); } public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) { $query = '(CASE ' . $this->field->dispatch($sqlWalker); for ($i=0, $limiti=count($this->values); $i < $limiti; $i++) { $query .= ' WHEN ' . $this->values[$i]->dispatch($sqlWalker) . ' THEN ' . $i; } $query .= ' END)'; return $query; } } 

    Puede escribir su propia extensión DQL .

    En caso de que el campo que desea “ordenar por” sea un tipo de datos ENUM, entonces ORDER BY funcionará en el orden en que se definieron los valores para ese campo ENUM.

    Por ejemplo, tenía un archivo definido como enum('n','pe','o','ap','c') que estaba dando un orden extraño. El pedido se arregló después de actualizar la enumeración a: enum('ap','c','n','o','pe')