【发布时间】:2014-10-17 07:37:40
【问题描述】:
我有实体
Template {
/**
* @ORM\OneToMany(targetEntity="TemplateSnapshot", mappedBy="template", cascade={"all"})
*/
protected $snapshots;
}
/**
* @ORM\Entity
*/
class TemplateSnapshot {
/**
* @ORM\Column(type="datetime")
* @var \DateTime
*/
protected $modTime;
}
并尝试在 TemplateSnapshot 中获取按最后一个 modTime 排序的模板
QueryBuilder $query
->leftJoin('EditorBundle:TemplateSnapshot','s','WITH', $tableAlias.'.id = s.template_id')
->groupBy($tableAlias.'.id')
->orderBy('s.modTime','desc')
;
我明白了
SELECT t0_.id AS id0, t0_.location AS location1, t0_.name AS name2, t1_.modTime AS modTime3 FROM Template t0_ LEFT JOIN TemplateSnapshot t1_ ON t0_.id = t1_.template_id LEFT JOIN TemplateSnapshot t2_ ON (t0_. id = t2_.template_id) t0_.name 在哪里? GROUP BY t0_.id ORDER BY t2_.modTime DESC LIMIT 20
这将返回第一个连接行。 (第一组然后排序)。我想加入最新的 TemplateSnapshot
其他尝试
$query
->leftJoin('TemplateEditorBundle:TemplateSnapshot',
's',
'WITH',
$tableAlias.'.id = s.template_id and s.modTime = MAX(s.modTime)'
)
->groupBy($tableAlias.'.id')
->orderBy('s.modTime','desc')
;
我明白了:
SELECT t0_.id AS id0, t0_.location AS location1, t0_.name AS name2, t1_.modTime AS modTime3, MAX(t2_.modTime) AS sclr4 FROM Template t0_ LEFT JOIN TemplateSnapshot t1_ ON t0_.id = t1_。 template_id LEFT JOIN TemplateSnapshot t2_ ON (t0_.id = t2_.template_id AND t2_.modTime = MAX(t2_.modTime)) t0_.name 在哪里? ORDER BY t2_.modTime DESC LIMIT 20
和错误
enter code here组函数使用无效
其他想法
我尝试直接查询 TemplateSnapshot
$source = new Entity('TemplateEditorBundle:TemplateSnapshot');
$query
->orderBy($tableAlias.'.modTime','desc') ->groupBy($tableAlias.'.template_id')
;
但它首先是 gorup 然后订购所以不要得到最新的。
【问题讨论】:
-
你要检索什么?
-
我想获取由 modDate 订购的具有唯一模板的 TemplateSnapshot。 TemplateSnapshot 有 template_id 行。
-
每一行都需要
Template数据还是template_id就足够了? -
您需要两个表中的所有数据还是只需要第一或第二列的具体数据?