Doctrine 2 не может использовать nullable = false в отношении manyToOne?

110

Есть Userодин, Packageсвязанный с ним. Многие пользователи могут обращаться к одному и тому же пакету. Userне может существовать без Packageопределенного. Userдолжен владеть отношением. Отношение является двунаправленным, поэтому у a Packageесть ноль или более пользователей.

Эти требования приводят к ManyToOneсоотношению for Userи OneToManyотношению of Packageв Doctrine 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)
Gremo
источник

Ответы:

193

Используйте аннотацию JoinColumn в своем отношении ManyToOne:

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

Сам ManyToOne не может иметь значение NULL, потому что он не относится к определенному столбцу. С другой стороны, JoinColumn идентифицирует столбец в базе данных. Таким образом, вы можете использовать «нормальные» атрибуты, такие как nullable или unique!

Sgoettschkes
источник
Спасибо, я пробовал, но, к сожалению, столбец package_idпо-прежнему помечен как NULL - Да, по умолчанию - NULL. Любая помощь очень ценится.
gremo
5
Неважно, двойные кавычки полностью ломают дело. Это nullable="false"неправильно!
gremo
Вы пробовали полностью удалить базу данных и создать новую? Я только что взглянул на свою базу данных (используя ту же аннотацию JoinColumn, как упоминалось выше), и она помечена как NotNull!
Sgoettschkes
5
Спасибо за это, мне было интересно, почему я не могу @ORM\Column(nullable=true)сделать свой manytoone обнуляемым!
Скотт Флэк
Если вы настроили правильный параметр и по-прежнему видите столбец базы данных с неправильным значением, не забудьте очистить кеш метаданных для Entity Manager. На Symfony вы можете использовать console doctrine:cache:clear-metadataкоманду
Массимилиано Арионе