Doctrine orm 使用针对可嵌入对象的条件筛选集合

Doctrine orm 使用针对可嵌入对象的条件筛选集合,doctrine-orm,doctrine,Doctrine Orm,Doctrine,假设您有一个类Title,并且使用titletransation类将标题翻译成多种语言。 要指示标题翻译为哪种语言,每个翻译都有一个Localevalue对象 为了可读性,我试图为Title类提供一个getTitle(Locale$Locale)方法,返回正确的翻译。 实现这一点的简单方法是循环所有翻译,并检查每个翻译的区域设置。 但是,我想使用标准来实现这一点,因此只会获取并水合一个标题翻译 为了说明这一情况,我正在使用的类的简化版本如下: 标题: /** @ORM\Entity @ORM\T

假设您有一个类
Title
,并且使用
titletransation
类将标题翻译成多种语言。 要指示标题翻译为哪种语言,每个翻译都有一个
Locale
value对象

为了可读性,我试图为
Title
类提供一个
getTitle(Locale$Locale)
方法,返回正确的翻译。 实现这一点的简单方法是循环所有翻译,并检查每个翻译的区域设置。 但是,我想使用
标准
来实现这一点,因此只会获取并水合一个
标题翻译

为了说明这一情况,我正在使用的类的简化版本如下:

标题:

/** @ORM\Entity @ORM\Table */
class Title
{
    /**
     * @ORM\OneToMany(targetEntity="TitleTranslation", mappedBy="element")
     */
    private $translations;
}
标题翻译:

/** @ORM\Entity @ORM\Table */
class TitleTranslation
{
    /**
     * @ORM\ManyToOne(targetEntity="Title", inversedBy="translations")
     */
    private $title;
    /**
     * @ORM\Column(type="string")
     */
    private $translation;
    /**
     * @ORM\Embedded(class="Locale")
     */
    private $locale;

    public function getTranslation() : string
    {
        return $this->translation;
    }
}
区域设置:

/** @Embeddable */
class Locale
{
    /** @ORM\Column(type="string")
    private $locale;

    public function __toString()
    {
        return $this->locale;
    }
}

我做了以下尝试,但均未成功:

public function getTitle(Locale $locale)
{
    $localeCriteria = Criteria::create()->where(Criteria::expr()->eq('locale', $locale));
    /** @var TitleTranslation | bool $translation */
    $translation = $this->translations->matching($translationCriteria)->first();

    return $translation ? $translation->getTranslation() : null;
}
这种方法失败的原因是出现了一个异常“Unrecognized field:locale”
,这似乎很正常,因为嵌入的文件应该被查询为“locale.locale”(VO中包含class.field的字段)。 但是,使用此符号:

$localeCriteria = Criteria::create()->where(Criteria::expr()->eq('locale.locale', $locale));
未定义属性时失败:titletransation::$locale.locale

是我遗漏了什么,还是这种方法根本不可能