หลักคำสอน 2 ไม่สามารถใช้ nullable = false ในความสัมพันธ์ manyToOne ได้หรือไม่?


110

Userมีหนึ่งPackageที่เกี่ยวข้องกับมัน ผู้ใช้หลายคนสามารถอ้างถึงแพ็กเกจเดียวกัน Userไม่สามารถดำรงอยู่ได้หากไม่มีการPackageกำหนด Userควรเป็นเจ้าของความสัมพันธ์ ความสัมพันธ์เป็นแบบสองทิศทางดังนั้นจึงPackageมีผู้ใช้เป็นศูนย์หรือมากกว่านั้น

ข้อกำหนดเหล่านี้นำไปสู่ManyToOneความสัมพันธ์UserและOneToManyความสัมพันธ์ของPackageหลักคำสอน 2 อย่างไรก็ตามpackage_idในuserตาราง (นั่นคือคีย์ต่างประเทศ) อนุญาตให้มีnullค่า ฉันได้ลองตั้งค่าnullable=falseแต่คำสั่ง:

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

บอกว่ามีแอตทริบิวต์ไม่มีสำหรับความสัมพันธ์nullable ฉันขาดอะไรไป?ManyToOne

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;

}

แก้ไข : แก้ไขแล้ว โปรดทราบว่าสิ่งนี้ผิด (หมายเหตุคำพูดคู่):

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

แม้ว่าสิ่งนี้จะถูกต้อง:

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

คำตอบ:


193

ใช้คำอธิบายประกอบ JoinColumn กับความสัมพันธ์ ManyToOne ของคุณ:

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

ManyToOne เองไม่สามารถเป็นโมฆะได้เนื่องจากไม่เกี่ยวข้องกับคอลัมน์เฉพาะ ในทางกลับกัน JoinColumn จะระบุคอลัมน์ในฐานข้อมูล ดังนั้นคุณสามารถใช้แอตทริบิวต์ "ปกติ" เช่น nullable หรือ unique!


ขอบคุณฉันได้ลองแล้ว แต่น่าเสียดายที่คอลัมน์package_idยังคงตั้งค่าสถานะเป็น Null - ใช่ค่าเริ่มต้น - NULL ความช่วยเหลือใด ๆ ที่ชื่นชมมาก
gremo

5
ไม่เป็นไรคำพูดสองครั้งทำลายสิ่งนั้นโดยสิ้นเชิง นั่นnullable="false"คือความผิด!
gremo

คุณลองลบฐานข้อมูลโดยรอบและสร้างใหม่หรือไม่? ฉันเพิ่งดูฐานข้อมูลของฉัน (โดยใช้คำอธิบายประกอบ JoinColumn เดียวกับที่กล่าวไว้ข้างต้น) และถูกตั้งค่าสถานะเป็น NotNull!
Sgoettschkes

5
ขอบคุณสำหรับสิ่งนี้ฉันสงสัยว่าทำไมฉันไม่สามารถทำให้หลายคนเป็น@ORM\Column(nullable=true)โมฆะได้!
Scott Flack

หากคุณกำหนดค่าตัวเลือกที่ถูกต้องและคุณยังคงเห็นคอลัมน์ฐานข้อมูลของคุณมีค่าที่ไม่ถูกต้องอย่าลืมล้างแคชข้อมูลเมตาสำหรับตัวจัดการเอนทิตี บน Symfony คุณสามารถใช้console doctrine:cache:clear-metadataคำสั่ง
Massimiliano Arione
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.