Doctrine 2 tidak dapat menggunakan nullable = false dalam relasi manyToOne?

110

Seorang Usermemiliki satu yang Packageterkait dengannya. Banyak pengguna dapat merujuk ke paket yang sama. Usertidak bisa ada tanpa Packageditentukan. Userharus memiliki relasi. Relasi bersifat dua arah, jadi a Packagememiliki nol atau lebih pengguna di dalamnya.

Persyaratan ini mengarah pada ManyToOnehubungan Userdan OneToManyhubungan Packagedalam Ajaran 2. Namun package_iddalam usertabel (yaitu kunci asing) memungkinkan nullnilai. Saya sudah mencoba pengaturan nullable=falsetetapi perintah:

 php app/console doctrine:generate:entities DL --path="src" --no-backup

Mengatakan bahwa tidak ada atribut nullableuntuk relasi tersebut ManyToOne. Apa yang saya lewatkan?

class User
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Package", inversedBy="users")
     */
    private $package;

}

class Package
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="User", mappedBy="package")
     */
    private $users;

}

EDIT : terselesaikan. harap dicatat bahwa ini salah (catat tanda kutip ganda):

 @ORM\JoinColumn(name="package_id", referencedColumnName="id", nullable="false")

Meskipun ini benar:

@ORM\JoinColumn(name="package_id", referencedColumnName="id", nullable=false)
gremo
sumber

Jawaban:

193

Gunakan anotasi JoinColumn pada relasi ManyToOne Anda:

/**
 * @ORM\ManyToOne(targetEntity="Package", inversedBy="users")
 * @ORM\JoinColumn(name="package_id", referencedColumnName="id", nullable=false)
 */
private $package;

ManyToOne itu sendiri tidak bisa nullable, karena tidak berhubungan dengan kolom tertentu. JoinColumn di sisi lain mengidentifikasi kolom dalam database. Jadi, Anda bisa menggunakan atribut "normal" seperti nullable atau unique!

Sgoettschkes
sumber
Terima kasih, saya sudah mencoba tetapi sayangnya kolom package_idtersebut masih ditandai sebagai Null - Yes, Default - NULL. Bantuan apa pun sangat dihargai.
gremo
5
Tidak apa-apa, tanda kutip ganda benar-benar merusaknya. Itu nullable="false"salah!
gremo
Apakah Anda mencoba menghapus database secara keseluruhan dan membuatnya baru? Saya baru saja melihat database saya (menggunakan anotasi JoinColumn yang sama seperti yang disebutkan di atas) dan itu ditandai sebagai NotNull!
Sgoettschkes
5
Terima kasih untuk ini, saya bertanya-tanya mengapa saya tidak bisa membuat banyak saya tidak dapat @ORM\Column(nullable=true)dibatalkan!
Scott Flack
Jika Anda mengkonfigurasi opsi yang benar dan Anda masih melihat kolom database Anda dengan nilai yang salah, ingatlah untuk menghapus cache metadata untuk Entity Manager. Di Symfony, Anda dapat menggunakan console doctrine:cache:clear-metadataperintah
Massimiliano Arione