Доктрина 2 - Запретить нулевое значение для внешних ключей отношений ManyToOne


У меня есть многоуровневые отношения в одной из моих сущностей, например:

class License {
    // ...
    /**
     * Customer who owns the license
     * 
     * @var \ISE\LicenseManagerBundle\Entity\Customer
     * @ORM\ManyToOne(targetEntity="Customer", inversedBy="licenses")
     * @ORM\JoinColumn(name="customer_id", referencedColumnName="id")
     */
    private $customer;
    // ...
}

class Customer {
    // ...
    /**
     * Licenses that were at one point generated for the customer
     * 
     * @var \Doctrine\Common\Collections\ArrayCollection
     * @ORM\OneToMany(targetEntity="License", mappedBy="customer")
     */
    private $licenses;
    // ...
}

Это создает схему базы данных, в которой поле "customer_id" таблицы лицензий может иметь значение null, что именно то, чего я не хочу.

Вот некоторый код, в котором я создаю запись, чтобы доказать, что она действительно допускает нулевые значения для ссылочных полей:

$em = $this->get('doctrine')->getEntityManager();
$license = new License();
// Set some fields - not the reference fields though
$license->setValidUntil(new \DateTime("2012-12-31"));
$license->setCreatedAt(new \DateTime());
// Persist the object
$em->persist($license);
$em->flush();

В принципе, я не хочу, чтобы Лицензия сохранялась без привязки к ней Клиента. Есть ли какая-нибудь аннотация это необходимо установить или мне просто нужно, чтобы объект Customer был передан конструктору моей лицензии?

Я использую движок базы данных MySQL версии 5.1, и я использую Доктрину 2 в приложении Symfony2.

Author: Tobias Gies, 2011-05-26

3 answers

Https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/annotations-reference.html#annref_joincolumn

Добавить nullable = false в аннотацию JoinColumn:

@ORM\JoinColumn(..., nullable=false)
 65
Author: zim32, 2018-04-16 08:16:21

Просто публикую, потому что @zim32 не сказал, куда мы должны поместить заявление, поэтому мне пришлось пробовать и ошибаться.

Ямл:

manyToOne:
    {field}:
        targetEntity: {Entity}
        joinColumn:
            name: {field}
            nullable: false
            referencedColumnName: {id}
        cascade: ['persist']
 1
Author: Rafael Barros, 2017-12-19 18:28:42

Я не смог найти XML пример того, как это сделать, поэтому я собираюсь оставить этот фрагмент здесь на случай, если кто-то еще ищет это:

<many-to-one field="author" target-entity="User">
    <join-column name="author_id" referenced-column-name="id" nullable="false" />
</many-to-one>

Требуется имя и имя столбца со ссылкой , см. Документы: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/xml-mapping.html#join-column-element

 0
Author: Stanzi1791, 2018-07-23 21:09:49