Установить внешний ключ таблицы1 на часть первичного ключа состава таблицы2 - PullRequest
0 голосов
/ 09 января 2019

Сначала извините за мой английский)

У меня есть следующие таблицы:

1) rejection_reasons

  • rejection_reason_id

  • locale_code

  • название

Первичный ключ: rejection_reason_id, locale_code

2) order_rejection_reasons

  • order_id

  • rejection_reason_id

Первичный ключ: order_id

Внешний ключ: rejection_reason_id ( Примечание! без поля locale_code )


Объекты:

class RejectionReason
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(name="rejection_reason_id", type="smallint", length=1, nullable=false)
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Id
     * @ORM\Column(name="locale_code", type="string", length=2, nullable=false, options={"fixed"=true})
     */
    private $localeCode;

    /**
     * @ORM\OneToMany(targetEntity="OrderRejectionReason", mappedBy="rejectionReason", cascade={"remove", "persist"}, orphanRemoval=true)
     */
    private $orderRejectionReasons;

    /**
     * @param int    $id
     * @param string $localeCode
     */
    public function __construct($id, $localeCode)
    {
        $this->id                    = $id;
        $this->localeCode            = $localeCode;
        $this->orderRejectionReasons = new ArrayCollection();
    }
}

class OrderRejectionReason
{
    /**
     * @var int
     *
     * @ORM\Column(name="order_id", type="integer", nullable=false, options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var RejectionReason
     *
     * @ORM\ManyToOne(targetEntity="RejectionReason", inversedBy="orderRejectionReasons")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="rejection_reason_id", referencedColumnName="rejection_reason_id", nullable=false, onDelete="CASCADE")
     * })
     */
    private $rejectionReason;
}

Doctrine возвращает ошибку:

Столбцы объединения ассоциации 'rejectionReason' должны соответствовать ВСЕМ столбцам идентификатора целевого объекта 'App \ Entity \ RejectionReason', однако 'locale_code' отсутствует.

Не могли бы вы помочь мне установить связь между этими таблицами?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Столбцы соединения ассоциации 'rejectionReason' должны соответствовать ВСЕ столбцы идентификатора , поэтому вам следует взглянуть на столбцы идентификатора. Как вы можете видеть, локальный код помечен как id (@ORM \ Id), а также как id, это означает, что вы создали составной первичный ключ.

Взгляните на: https://www.doctrine -project.org / projects / doctrine-orm / en / 2.6 / tutorials / композитный файл-primary-keys.html

Поскольку это составной первичный ключ, вы не можете относиться только к одному из двух идентификаторов (JoinColumn, referencedColumnName = "id").

Вы можете рассмотреть возможность сделать localeCode уникальным вместо идентификатора, который должен решить вашу проблему. (Поэтому вы должны решить, должен ли localCode быть идентификатором). Вы также можете попробовать добавить localCode в аннотацию JoinColumn.

0 голосов
/ 09 января 2019

Попробуйте без лишних фигурных скобок и JoinColumn оператора

class OrderRejectionReason
{
    /**
     * @var RejectionReason
     *
     * @ORM\ManyToOne(targetEntity="RejectionReason", inversedBy="orderRejectionReasons")
     * @ORM\JoinColumn(name="rejection_reason_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
     */
    private $rejectionReason;
}

РЕДАКТИРОВАТЬ I: Добавлено name="rejection_reason_id", referencedColumnName="rejection_reason_id"

РЕДАКТИРОВАТЬ II: Изменено referencedColumnName="rejection_reason_id" на referencedColumnName="id"

...