Symfony 2 DQL查询查找未拆分的记录

时间:2015-11-26 14:01:31

标签: mysql symfony translation dql

我必须找到我的某个实体的无统计记录,让我们称之为Product

我已经使用所有可翻译属性和区域设置(标题/文本/区域设置)确定了一个Product实体。 我还确定了一个ProductParent实体,其中包含所有不需要翻译的属性(图片)。 ProductParent通过Product关系与ManyToOne相关联(Product是该关系的所有者。)

产品看起来像: id | title | text | parent_id | locale

ProductParent看起来像: id | image

我现在需要的是能够获取Product中哪些记录未被翻译成给定的区域设置(' es'),' en'作为默认'语言环境。 所以我需要找到所有只有locale = en。

的记录

我已经开始了DQL查询,但它根本没有工作,而且它真的不是我的"一杯茶"。

SELECT a 
FROM ProductParent a
LEFT JOIN Product b
ON a.id = b.parent_id
WHERE b.locale
IN ("en", "es")
GROUP BY a.id
HAVING COUNT * < 2

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

这可能会对你有帮助。

public function findUnstranslated($default) {

    $query = $em->createQueryBuilder('p')
        ->leftJoin('p.parent_id', 'parent')
        ->where('p.locale = :locale')
        ->setParameter('locale', $default)
        ->groupBy('parent.id')
        ->having('COUNT(parent.id) < 2')
        ->getQuery();

    return $query->getResult();

}

答案 1 :(得分:1)

理论上你可以这样做:

... WHERE b.locale = 'en' AND b.id NOT IN (SELECT id FROM `blah-blah` WHERE locale = "es")

答案 2 :(得分:0)

使用此查询适用于我:

public function findUnstranslated($default, $locale)
{
    return $this->createQueryBuilder('p')
        ->leftJoin('p.parent', 'parent')
        ->where('p.locale IN (:locale)')
        ->setParameter('locale', [$default, $locale])
        ->groupBy('parent.id')
        ->having('COUNT(parent.id) < 2')
        ->getQuery()
        ->getResult();
}