Doctrine orm 如何规避错误的原则和规则
我正在使用symfony 2.8.39和Doctrine 2.4.8,在分页结果方面存在问题。底层是Mysql5.7服务器 关于传呼的文件说: 分页原则查询并不像您在 开始如果您有一对多的复杂获取连接场景 或使用“默认”限制功能的多对多关联 数据库供应商的数量不足以获得正确的结果 这正是我的处境。我在SQL translation中的语句如下所示:Doctrine orm 如何规避错误的原则和规则,doctrine-orm,orm,pagination,symfony-2.8,Doctrine Orm,Orm,Pagination,Symfony 2.8,我正在使用symfony 2.8.39和Doctrine 2.4.8,在分页结果方面存在问题。底层是Mysql5.7服务器 关于传呼的文件说: 分页原则查询并不像您在 开始如果您有一对多的复杂获取连接场景 或使用“默认”限制功能的多对多关联 数据库供应商的数量不足以获得正确的结果 这正是我的处境。我在SQL translation中的语句如下所示: SELECT sc.id, sc.name, scc.prio, sd.description FROM sang_contents sc JOI
SELECT sc.id, sc.name, scc.prio, sd.description
FROM sang_contents sc
JOIN sang_categories_contents scc
JOIN sang_descriptions sd
JOIN sang_languages sl
WHERE
sc.id = scc.content_id AND
scc.category_id = 20 AND
scc.is_enabled = 1 AND
sc.id = sd.content_id AND
sd.language_id = sl.id AND
sd.description != "" AND
sl.name = "DE"
ORDER BY scc.prio ASC, sc.id DESC
由于ORM是3.0版,而且这个问题从一开始就存在,我认为ORM不会在任何时候修复它。
那么,如何实现分页的正确结果呢
到目前为止,我解决这个问题的想法是对简化的数据进行分页,分页应该能够正确处理:
- 创建一个包含所有类别和语言的结果的表,并使用额外的实体访问该表。 缺点是,每次在for connected表中进行更改时,我都必须更新此表李>
$page = max(0, $request->query->getInt('page', 0));
$pageRequest = new PageRequest($itemsPerPage, $page);
$query = $this->em->createQuery(
'SELECT sc, sd
FROM NamiApiCoreBundle:Content sc
JOIN sc.categoryContents scc
JOIN sc.descriptions sd
JOIN sd.language sl
WHERE
sc.id = scc.content AND
scc.category = :id AND
scc.enabled = 1 AND
sc.id = sd.content AND
sd.language = sl.id AND
sd.description != \'\' AND
sl.iso = :lang
ORDER BY scc.priority ASC, sc.id DESC'
)
->setFirstResult($pageRequest->getOffset())
->setParameter('lang', $lang)
->setParameter('id', $categoryId)
->useResultCache(true, $this->cache_lifetime);
if ($itemsPerPage > 0) {
$query->setMaxResults($pageRequest->getSize());
}
$paginator = new Paginator($query);
您是否尝试了问题中第一个链接中描述的默认原则分页器?报价不是针对这个分页器的,而是使用没有任何分页器的查询生成器的setFirstResults和setMaxResults。啊,你认为如果我手动拆分结果,应该可以吗?那么,分页器又有什么用呢?是的,我用这种方法。我在问题描述中添加了原始查询的代码。分页器的代码看起来不错。我认为这些条件“sc.id=scc.content”、“sc.id=sd.content”和“sd.language=sl.id”是不需要的。为什么您认为它们没有必要?它们是连接条件,学说将通过这些关系来构造这些条件。获取由geQuery()生成的sql->getSql(),您应该会看到