【发布时间】:2015-07-14 07:10:15
【问题描述】:
给定这个实体
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;
}
...还有这个 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();
...我希望获得“具有指定序列的用户的 SystemRecords,但只有那些具有任何 SystemRecord 中最新日期的用户”。换句话说,在程序上,“查找任何用户的任何 SystemRecord 的最近日期。然后查找指定用户在该日期发生的记录。”
如果我写sql,我会写
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 = ?
但是,学说给了我以下 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 = ?)
这不是我想要的。这给了我“系统记录与具有指定序列的用户的最新系统记录具有相同日期的所有用户的系统记录”。
如何使用 dql 制定我的查询?
【问题讨论】:
-
您如何在
dql中定义应该使用哪些字段来连接两个表?它是否应该以某种方式隐含地得出这些信息?在您的dql文本中,我没有看到任何提及r应与u加入r.user_serial = u.serial。 -
无论如何,如果您将
and r.user_serial = :serial或and r.user_serial = u.serial添加到dql文本的where部分,您应该会得到产生正确结果的SQL 查询。 -
@VladimirBaranov 我想教义使用带有@Id 注释的字段来确定加入实体关联时要使用的主键。我无法添加您建议的添加内容,因为该实体没有名为
user_serial的字段,因此教义会引发错误。
标签: php sql doctrine-orm dql