Доктрина 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.
3 answers
Добавить nullable = false
в аннотацию JoinColumn
:
@ORM\JoinColumn(..., nullable=false)
Просто публикую, потому что @zim32 не сказал, куда мы должны поместить заявление, поэтому мне пришлось пробовать и ошибаться.
Ямл:
manyToOne:
{field}:
targetEntity: {Entity}
joinColumn:
name: {field}
nullable: false
referencedColumnName: {id}
cascade: ['persist']
Я не смог найти 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