【问题标题】:Symfony 2 knplabs form translation - best way to change the referenceColumNameSymfony 2 knplabs 表单翻译 - 更改 referenceColumName 的最佳方法
【发布时间】:2015-04-09 13:22:44
【问题描述】:

A2lix 需要 'id' 作为 referenceColumName。但是我的实体具有不同的列名(例如 ProductID 而不是 id)。因此,当我尝试通过教义更新数据库时出现错误:schema:update --force。

我的实体示例

class Period
{

    use ORMBehaviors\Translatable\Translatable,
        ORMBehaviors\Timestampable\Timestampable,
        ORMBehaviors\SoftDeletable\SoftDeletable
    ;

    /**
     * @var integer
     *
     * @ORM\Column(name="PeriodID", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

...

KnpDoctrineBehaviors 包的 TranslatableSubscriber 类的一部分

...

   private function mapTranslatable(ClassMetadata $classMetadata)
    {
        if (!$classMetadata->hasAssociation('translations')) {
            $classMetadata->mapOneToMany([
                'fieldName'     => 'translations',
                'mappedBy'      => 'translatable',
                'indexBy'       => 'locale',
                'cascade'       => ['persist', 'merge', 'remove'],
                'fetch'         => $this->translatableFetchMode,
                'targetEntity'  => $classMetadata->getReflectionClass()->getMethod('getTranslationEntityClass')->invoke(null),
                'orphanRemoval' => true
            ]);
        }
    }

    private function mapTranslation(ClassMetadata $classMetadata)
    {
        if (!$classMetadata->hasAssociation('translatable')) {

            $classMetadata->mapManyToOne([
                'fieldName'    => 'translatable',
                'inversedBy'   => 'translations',
                'fetch'         => $this->translationFetchMode,
                'joinColumns'  => [[
                    'name'                 => 'translatable_id',
                    'referencedColumnName' => 'id',
                    'onDelete'             => 'CASCADE'
                ]],
                'targetEntity' => $classMetadata->getReflectionClass()->getMethod('getTranslatableEntityClass')->invoke(null),
            ]);
        }

        $name = $classMetadata->getTableName().'_unique_translation';
        if (!$this->hasUniqueTranslationConstraint($classMetadata, $name)) {
            $classMetadata->table['uniqueConstraints'][$name] = [
                'columns' => ['translatable_id', 'locale' ]
            ];
        }

        if (!$classMetadata->hasField('locale')) {
            $classMetadata->mapField(array(
                'fieldName' => 'locale',
                'type'      => 'string'
            ));
        }

    }

...

任何想法或帮助将不胜感激。

非常感谢 ;-)

【问题讨论】:

  • 嘿本杰明,我也有同样的要求。您是否找到了设置自定义“referencedColumnName”的好方法?

标签: doctrine-orm symfony-2.6 a2lix-translation


【解决方案1】:

您可以使用: association override

我试图覆盖属性,但它们是由订阅者创建的,我遇到了异常。你也可以在你的实体类上重新声明注解manyToOne。 它对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2015-04-09
    • 2023-04-02
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多