Symofny2查询构建器leftJoin,条件来自Many关系

时间:2016-12-12 12:39:59

标签: php mysql symfony doctrine-orm query-builder

我的产品在另一个表中保存了多种语言的描述,名称等。一种产品可以有多种翻译(产品数据)。

目前,我获得了该产品的所有翻译,并根据语言环境进行了预测和ifs以获得所需的翻译...如果有许多语言,那么这个循环会变得庞大而丑陋......

我希望根据区域设置从查询中获取所需的翻译数据。我正在进行此查询,但它不起作用:

    $query = $this->createQueryBuilder('p')
        ->select([
            'p',
            'pt',
            'lang',
        ])
        ->leftJoin('p.translations', 'pt', 'with', 'pt.language.iso = :locale')
        ->leftJoin('pt.language', 'lang')
        ->where("p.status = 1")
        ->SetParameter('locale', $locale)
        ->add('orderBy','p.position ASC');
return $query->getQuery()->getResult();

这是我尝试的选项之一,我认为这是我最接近解决方案,但我得到错误:

[Semantical Error] line 0, col 281 near 'iso = :locale': Error: Class Mp\ShopBundle\Entity\ProductLanguageData has no field or association named language.iso

错误说明了一切,但我不明白如何解决这个问题。任何帮助都会被贬低。

1 个答案:

答案 0 :(得分:0)

我不知道您的列的外观如何,但是您的语言表包含列" iso"并且你有表product_translation必须包含类似" language_id"和" product_id",对吗?然后您的查询可能如下所示:

$query = $this->createQueryBuilder('p')
        ->select([
            'p',
            'pt',
            'lang',
        ])
        ->join('language', 'lang', 'with', 'l.iso = :locale')
        ->join('product_translations', 'pt', 'with', 'pt.language_id = l.id and p.id = pt.product_id')
        ->where("p.status = 1")
        ->SetParameter('locale', $locale)
        ->add('orderBy','p.position ASC');

您应该创建两个自定义联接。首先使用iso列加入语言,然后加入转换表。您需要将产品表与转换表绑定在一起,此处需要指向语言和产品的链接。