假设您有一个班级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
我错过了什么,或者这种做法根本不可能?