web-dev-qa-db-fra.com

Doctrine 2 - Interdit la valeur null sur les clés étrangères des relations ManyToOne

J'ai une relation ManyToOne dans l'une de mes entités, comme ceci:

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;
    // ...
}

Cela génère un schéma de base de données dans lequel le champ "customer_id" de la table de licences est autorisé à être null, ce qui est exactement ce que je ne veux pas.

Voici un code dans lequel je crée un enregistrement pour prouver qu'il autorise effectivement des valeurs NULL pour les champs de référence:

$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();

Fondamentalement, je ne veux pas qu'une licence soit conservée sans qu'un client soit affecté à celle-ci. Des annotations doivent-elles être définies ou dois-je simplement exiger qu'un objet Client soit transmis au constructeur de ma licence?

Le moteur de base de données que j'utilise est MySQL v5.1 et j'utilise Doctrine 2 dans une application Symfony2.

49
Tobias Gies

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

Ajoutez nullable = false à l'annotation JoinColumn:

@ORM\JoinColumn(..., nullable=false)
68
zim32

Juste en train de poster parce que @ zim32 ne disait pas où nous devrions mettre la déclaration, je devais donc faire un essai et une erreur.

Yaml:

manyToOne:
    {field}:
        targetEntity: {Entity}
        joinColumn:
            name: {field}
            nullable: false
            referencedColumnName: {id}
        cascade: ['persist']
1
Rafael Barros

Je ne pouvais pas trouver un exemple XML illustrant cette procédure. Je vais donc laisser cet extrait ici au cas où quelqu'un d'autre le rechercherait:

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

Les noms nom et nom-colonne-référencé sont obligatoires, voir la documentation: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/xml -mapping.html # join-column-element

0
Stanzi1791