在 Symfony 中,如何翻译实体中的关联字段(外键)?

Posted

技术标签:

【中文标题】在 Symfony 中,如何翻译实体中的关联字段(外键)?【英文标题】:In Symfony, how do I translate an associated field (foreign key) in an entity? 【发布时间】:2019-03-08 21:06:38 【问题描述】:

我有一个包含 图库Event 实体。每个语言环境应该有不同的画廊。我在这里应用了与我的 title 字符串相同的 Translatable 注释:

 use Gedmo\Mapping\Annotation as Gedmo;
 use Sonata\TranslationBundle\Model\Gedmo\TranslatableInterface;
 use Sonata\TranslationBundle\Traits\Gedmo\PersonalTranslatableTrait;    

 /** other codes hidden for brevity **/

/**
* @ORM\Entity(repositoryClass="App\Repository\EventRepository")
* @ORM\Table(name="events")
* @Gedmo\TranslationEntity(class="App\Entity\Translation\EventTranslation")
*/
class Event implements TranslatableInterface 
   use PersonalTranslatableTrait;

   /** other fields hidden for brevity **/

   /**
    * @var Gallery $gallery
    *
    * @ORM\ManyToOne(targetEntity="App\Sonata\MediaBundle\Entity\Gallery", cascade="persist")
    * @ORM\JoinColumns(
    *     @ORM\JoinColumn(name="gallery_id", referencedColumnName="id", onDelete = "SET NULL")
    * )
    * 
    * @Gedmo\Translatable()
    */
   private $gallery;

但在刷新时,我得到:

InvalidMappingException 无法在实体 - App\Entity\Event 中找到可翻译的 [图库] 作为映射属性

顺便说一下,标题字符串和其他可翻译字符串工作正常(即在 event_translations 表中创建条目没有错误)

因此,例如,默认语言环境 (en) 和其他语言环境 (ph, wb)

我的预期结果是这样的:

table: event
----------------------------------
id  |   title       |   gallery_id
23  |   my event    |   451
----------------------------------

table: event_translations
----------------------------------------------------------------------------
id  |locale |object_class       |field      |foreign_key    |content
1   |ph     |App\Entity\Event   |title      |23             |aking piyesta
2   |ph     |App\Entity\Event   |gallery    |23             |452
3   |wb     |App\Entity\Event   |gallery    |23             |453
----------------------------------------------------------------------------

标题翻译行已经正确。 我只是希望同样的逻辑也适用于画廊。

【问题讨论】:

你实现了 Translatable 吗?前任。 class Article 实现了 Translatable content 并定义了 Gedmo\Translatable\Translatable in use section ? @3y3skill3r 是的,正常的翻译工作正常,例如为字符串标题。我隐藏了部分代码。 @3y3skill3r 请看我上面的更新代码 我不明白。预期的结果是什么?一个事件有几个不同的画廊实体标记了语言环境?一个 Event 有一个单独的画廊,但有些东西会根据语言环境以某种方式翻译它?你认为你的桌子应该是什么样子? @NicolasB 我已经用上面的更多细节更新了我的问题。基本上,我的预期结果是一个事件将有几个不同的画廊实体标记有语言环境 【参考方案1】:

我认为以下应该可行。

翻译类应该是这样的:

/**
 * @ORM\Entity
 * @ORM\Table(name="event_translation")
 */
class EventTranslation extends AbstractPersonalTranslation

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Event", inversedBy="translations")
     * @ORM\JoinColumn(name="object_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $object;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Gallery")
     * @ORM\JoinColumn(name="gallery_id", referencedColumnName="id")
     */
    private $gallery;

Event 类是:

/**
* @ORM\Entity(repositoryClass="App\Repository\EventRepository")
* @ORM\Table(name="events")
* @Gedmo\TranslationEntity(class="App\Entity\Translation\EventTranslation")
*/
class OrderEntity implements TranslatableInterface

    use PersonalTranslatableTrait;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Translation\EventTranslation", mappedBy="object", cascade="persist")
     * @Gedmo\Translatable()
     */
    private $translations;

    // ...


所以画廊是 EventTranslation 的一个字段,而不是直接的 Event 的一个字段。

告诉我进展如何。

【讨论】:

以上是关于在 Symfony 中,如何翻译实体中的关联字段(外键)?的主要内容,如果未能解决你的问题,请参考以下文章

在选择类型 Symfony 5 中显示相关实体中的特定字段

从 Symfony2/Twig 中的 2 位国家代码获取翻译的国家名称?

如何向 symfony 2 表单添加一些额外的数据

Symfony 3 上的 Sonata Admin 实体翻译

Symfony 映射错误:“映射相互不一致”和“关联引用了不存在的反向侧字段”

教义自引用关联映射(Symfony)