Given this object
class SystemRecord { /** * @ORM\Id * @ORM\Column(type="integer", name="ID") * @ORM\GeneratedValue * @var int */ private $id; /** * @ORM\ManyToOne(targetEntity="Application\Entity\User") * @ORM\JoinColumn(name="USER_SERIAL", referencedColumnName="SERIAL", nullable=false) * @var User */ private $user; /** * @ORM\Column(type="utcdatetime", name="DATE_DATA_WAS_FETCHED", nullable=false) * @var DateTimeInterface */ private $dateDataWasFetched; }
... and this is dql
$dql = " select r from Application\\Entity\\SystemRecord r join Application\\Entity\\User u where r.dateDataWasFetched = ( select max(r2.dateDataWasFetched) from Application\\Entity\\SystemRecord r2 ) and u.serial = :serial "; $query = $this->getEntityManager()->createQuery($dql); $query->setParameter('serial', $user->getSerial()); $sql = $query->getSql();
... I hope to get "SystemRecords for the user with the specified serial number, but only those who have the most recent date from any SystemRecord." In other words, procedurally, "find the latest date of any SystemRecord for any user. Then find the records for the specified user that occurred on that date."
If I wrote sql, I would write
select * from SYSTEM_RECORDS r join USER u on r.USER_SERIAL = u.SERIAL where DATE_DATA_WAS_FETCHED = (select max(DATE_DATA_WAS_FETCHED) from SYSTEM_RECORDS) and u.SERIAL = ?
But, the doctrine gives me the following sql
SELECT ...fields from s0_ ... FROM SYSTEM_RECORDS s0_ INNER JOIN USER u1_ ON (s0_.DATE_DATA_WAS_FETCHED = (SELECT max(s2_.DATE_DATA_WAS_FETCHED) AS dctrn__1 FROM SYSTEM_RECORDS s2_) AND u1_.SERIAL = ?)
This is not what I want. This gives me "SystemRecords for all users whose SystemRecords have the same date as the most recent SystemRecords for the user with the specified serial number."
How to formulate my query using dql?
sql php doctrine2 dql
goat
source share