Доктрина ManyToMany со ссылкойColumnName - PullRequest
0 голосов
/ 24 октября 2019

У меня есть две модели, которые имеют отношение ко многим. ID не управляется доктриной, а управляется генератором GUID из другого приложения. Таким образом, у моих сущностей есть поле с именем uniqueIdentifier, а не id. Таким образом:

class Bar {
    /**
    * @ManyToMany(targetEntity="Foo", mappedBy="bar")
    */
    private $foo;

}

class Foo {
    /**
    * @ManyToMany(targetEntity="Bar", mappedBy="foo")
    */
    private $bar;

}

Я получаю сообщение об ошибке Column name 'id' referenced for relation from App\Entity\Foo towards App\Entity\Bar does not exist. Что я знаю, так это из-за того, что доктрина по умолчанию отображает вещи в _id для имени ссылочного столбца и table1_table2 для объединяемых таблиц.

Я не могу переопределить значение по умолчанию, потому что в некоторых моделях сгенерировано автоматическизначения и полагаться на поле id. Вместо этого я хотел бы сделать что-то вроде следующего:

class Bar {
    /**
    * @ManyToMany(targetEntity="Foo", mappedBy="bar")
    * @JoinColumn(name="foo_uid", referencedColumnName="uniqueIdentifier")
    */
    private $foo;

}

class Foo {
    /**
    * @ManyToMany(targetEntity="Bar", mappedBy="foo")
    * @JoinColumn(name="bar_uid", referencedColumnName="uniqueIdentifier")
    */
    private $bar;

}

Это не работает, и я получаю ту же ошибку. Как это сделать?

1 Ответ

1 голос
/ 24 октября 2019

Ваше сопоставление ассоциации должно быть примерно таким:

class Bar
{
    /**
     * @var Foo[]|\Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="Foo", inversedBy="bar")
     * @ORM\JoinTable(
     *     name="table1_table2",
     *     joinColumns={
     *          @ORM\JoinColumn(name="foo_uid", referencedColumnName="uniqueIdentifier")
     *     },
     *     inverseJoinColumns={
     *          @ORM\JoinColumn(name="bar_uid", referencedColumnName="uniqueIdentifier")
     *     }
     * )
     */
    private $foo;
}

class Foo {
    /**
     * @var Bar[]|\Doctrine\Common\Collections\Collection 
     * 
     * @ORM\ManyToMany(targetEntity="Bar", mappedBy="foo")
     */
    private $bar;
}

Помните, что столбцы foo_uid и bar_uid будут находиться в таблице table1_table2, а uniqueIdentifier является идентификатором в таблицах Фу и Бара.

...