Ich schreibe eine einfache benutzerdefinierte Doktrin-Funktion auf Symfony, die AGE berechnet, wenn das Bithdatum der Entität angegeben wird. Hier ist meine Funktion:Symfony Custom DoctrineFunctions gibt immer null zurück
class AgeFunction extends FunctionNode
{
private $birthDate;
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->birthDate = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
$bday = $this->birthDate->dispatch($sqlWalker);
$currDate = DateFormatter::formatDate(new \DateTime());
return "TIMESTAMPDIFF(YEAR, {$bday}, '{$currDate}')";
}
}
Und hier ist, wie ich es verwendet:
public function getAge()
{
$qb = $this->createQueryBuilder('s')
->select('AGE(s.dateOfBirth)')
->orderBy('s.id', 'DESC');
dump($qb->getQuery()->getResult());
}
Dies ist die Abfrage erzeugt:
SELECT TIMESTAMPDIFF (YEAR, s0_.date_of_birth, ‚2017 -04-13 ') AS sclr_0 FROM verdächtiger s0_ ORDER BY s0_.id DESC;
Ich denke, was hier falsch ist s0_.date_of_birth bekommt nie den tatsächlichen Wert, da, wenn ich ersetzen es gut funktioniert manuell.
Also wie kann ich das tun? Vielen Dank.
Zeigt die produzierte Abfrage ein Ergebnis, wenn Sie es direkt in Ihrem SQL-Client (wie phpmyadmin) ausführen? Ich habe es in einer meiner Datenbanken getestet und die Abfrage scheint korrekt zu sein. –
Ich bin ein bisschen neugierig, warum das Zeitalter mit der Doktrin und nicht mit PHP zu tun hat? – goto