Doctrine 2 không thể sử dụng nullable = false trong quan hệ manyToOne?


110

An Usercó một Packageliên kết với nó. Nhiều người dùng có thể tham khảo cùng một gói. Userkhông thể tồn tại mà không có một Packageđịnh nghĩa. Usernên sở hữu quan hệ. Mối quan hệ là hai chiều, do đó, một Packagekhông có hoặc nhiều người dùng trong đó.

Những yêu cầu này dẫn đến ManyToOnequan hệ for UserOneToManyquan hệ của Packagetrong Doctrine 2. Tuy nhiên, package_idtrong userbảng (đó là khóa ngoại) cho phép nullcác giá trị. Tôi đã thử cài đặt nullable=falsenhưng lệnh:

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

Nói rằng không có thuộc tính nullablecho mối quan hệ ManyToOne. Tôi đang thiếu cái gì?

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 : đã giải quyết. xin lưu ý rằng điều này là sai (lưu ý dấu ngoặc kép):

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

Mặc dù điều này là chính xác:

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

Câu trả lời:


193

Sử dụng chú thích JoinColumn trên quan hệ ManyToOne của bạn:

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

Bản thân ManyToOne không thể trống, vì nó không liên quan đến một cột cụ thể. Mặt khác, JoinColumn xác định cột trong cơ sở dữ liệu. Do đó, bạn có thể sử dụng các thuộc tính "bình thường" như nullable hoặc unique!


Cảm ơn, tôi đã thử nhưng rất tiếc cột package_idvẫn bị gắn cờ là Null - Có, Mặc định - NULL. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao.
gremo

5
Đừng bận tâm, một dấu ngoặc kép hoàn toàn phá vỡ mọi thứ. Đó nullable="false"là sai lầm!
gremo

Bạn đã thử xóa cơ sở dữ liệu một cách ngẫu nhiên và tạo mới nó chưa? Tôi vừa mới xem cơ sở dữ liệu của mình (sử dụng cùng chú thích JoinColumn như đã đề cập ở trên) và nó được gắn cờ là NotNull!
Sgoettschkes

5
Cảm ơn vì điều này, tôi đã tự hỏi tại sao tôi không thể làm cho nó vô hiệu hóa nhiều thứ @ORM\Column(nullable=true)của tôi!
Scott Flack

Nếu bạn đã định cấu hình tùy chọn phù hợp và bạn vẫn thấy cột cơ sở dữ liệu của mình có giá trị sai, hãy nhớ xóa bộ nhớ cache siêu dữ liệu cho Trình quản lý thực thể. Trên Symfony, bạn có thể sử dụng console doctrine:cache:clear-metadatalệnh
Massimiliano Arione
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.