Symofny2 查询生成器 leftJoin 条件来自许多关系

Symofny2 Query builder leftJoin with condition from Many relationship

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

目前我获得了产品的所有翻译,并执行 foreach 和 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

错误说明了一切,但我不明白如何解决这个问题。如有任何帮助,我们将不胜感激。

我不知道你的专栏到底是什么样子,但你有一个 table 语言包含 "iso" 栏,你有 table 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栏,再加入翻译table。并且您需要将产品 table 与翻译 table 绑定,这里您需要 link 到语言和产品。