使用针对Embeddable对象的Criteria过滤集合

时间:2017-08-10 08:26:10

标签: doctrine-orm doctrine

假设您有一个班级Title,并使用TitleTranslation类以多种语言翻译标题。 为了表明标题被翻译成哪种语言,每个翻译都有一个Locale值对象。

为了便于阅读,我尝试为Title类提供getTitle(Locale $locale)方法,并返回正确的翻译。 执行此操作的简单方法是循环遍历所有翻译,并检查每个翻译的区域设置。 但是,我想使用Criteria来完成此操作,因此只会提取和补充一个TitleTranslation

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

名称:

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

TitleTranslation:

/** @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;
}

这种方法失败了ORMException "Unrecognized field: locale",看起来很正常,因为Embeddables应该被查询为“locale.locale”(字段包含类字段在VO中)。 但是,使用这种表示法:

$localeCriteria = Criteria::create()->where(Criteria::expr()->eq('locale.locale', $locale));

Undefined property: TitleTranslation::$locale.locale

失败

我错过了什么,或者这种做法根本不可能?

0 个答案:

没有答案