Доктрина 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;

}

EDIT : вирішено. зверніть увагу, що це неправильно (зверніть увагу на подвійні лапки):

 @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 ідентифікує стовпчик у базі даних. Таким чином, ви можете використовувати "звичайні" атрибути на зразок нульових або унікальних!


Дякую, я спробував, але, на жаль, стовпець package_idвсе ще позначений як Null - Так, за замовчуванням - NULL. Будь-яка допомога дуже цінується.
gremo

5
Не забудьте, подвійна цитата повністю розбиває річ. Це nullable="false"неправильно!
gremo

Ви намагалися цілком видалити базу даних і створити її новою? Я щойно переглянув мою базу даних (використовуючи ту ж анотацію JoinColumn, що і раніше), і вона позначена як NotNull!
Sgoettschkes

5
Дякую за це, мені було цікаво, чому я не зміг би зробити так, @ORM\Column(nullable=true)щоб мій багатогранник мінявся!
Скотт Флак

Якщо ви налаштували правильний параметр і все ще бачите стовпець бази даних з неправильним значенням, не забудьте очистити кеш метаданих для Entity Manager. На Symfony ви можете скористатися console doctrine:cache:clear-metadataкомандою
Massimiliano Arione
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.