我在“ext_translations”表中有一个包含所有翻译的表。
翻译很有效。现在的问题是:我想通过sonata-admin bundle管理这些翻译。
我已经找到了一个文档,如何使用sonata admin获取工作学说扩展。但就我而言,我的所有翻译都有 ONE table / entity (适用于多个实体)。
所以根据这个文档:http://www.elao.com/blog/symfony-2/doctrine-2/how-to-manage-translations-for-your-object-using-sonataadminbundle.html我的mappedBy属性应该是什么(见下文)?
ext_translations表:
mysql> show columns from ext_translations;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| locale | varchar(8) | NO | MUL | NULL | |
| object_class | varchar(255) | NO | | NULL | |
| field | varchar(32) | NO | | NULL | |
| foreign_key | varchar(64) | NO | | NULL | |
| content | longtext | YES | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
的mappedBy:
/**
* @ORM\OneToMany(targetEntity="ProfileTranslation", mappedBy="object", cascade={"persist", "remove"})
*/
protected $translations;
据我所知这里的问题:“我有一个复合键(对象类(实体)+名称(属性)+ foreignKey(实体的id)),那么'mappedBy'应该如何引用它?
我不想为每个可翻译实体创建一个额外的类(如上面的教程中那样)
答案 0 :(得分:2)
你的情况非常复杂。如果你不使用任何anotation override the repository class,并构建你自己的逻辑,可能最好的。
我们可以尝试利用Doctrine 2.1创建复合复合键作为主键的新功能,正如Feras在他的评论中所说的那样。
Doctrine 2原生支持复合主键。复合键 是一个非常强大的关系数据库概念,我们非常谨慎 确保Doctrine 2支持尽可能多的复合主键 用例。对于Doctrine 2.0,原始数据类型的复合键是 支持,对于Doctrine 2.1甚至是外键作为主键 支撑。
在文档中,我们有一个与您的用例大致相似的用例的好例子:
实体的动态属性(例如文章)。每篇文章 有许多属性与主键“article_id”和 “属性名称”。
但由于这种方法只考虑一个实体,我们必须根据您的需求进行调整。我们可以按照以下步骤操作:
创建ext_translations
表
CREATE VIEW profile_ext_translations
AS
SELECT *
FROM ext_translations
WHERE object_class = 'Profile'
然后为该视图创建不同的实体,即您将拥有一个具有复合主键的实体ProfileExtTranslations
,如下所示:
**
* @Entity
*/
class ProfileExtTranslations
{
/**
* @ORM\ManyToOne(targetEntity="Profile", inversedBy="translations")
* @ORM\JoinColumn(name="foreign_key", referencedColumnName="id", onDelete="CASCADE")*/
private $profile;
/** @Id @Column(type="string") */
private $field;
//Other fields and methods
}
现在,您只需使用的翻译的mappedBy中的Profile实体的代码:
/**
* @ORM\OneToMany(targetEntity="ProfileExtTranslation", mappedBy="profile", cascade={"persist", "remove"})
*/
protected $translations;
有了这个,可能还有一个小小的调整,你应该让它运转起来。