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
是我遗漏了什么,还是这种方法根本不可能