Doctrine 2はmanyToOneリレーションでnullable = falseを使用できませんか?


110

アンはUser1持ってPackage、それに関連します。多くのユーザーが同じパッケージを参照できます。定義Userなしでは存在できませんPackageUser関係を所有する必要があります。関係は双方向であるため、にPackageは0人以上のユーザーがいます。

これらの要件は、につながるManyToOneため関係UserOneToManyの関係Packageが教義2中package_iduserできます(外部キーであること)テーブル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

ManyToOneリレーションでJoinColumnアノテーションを使用します。

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

ManyToOne自体は特定の列に関連しないため、nullにすることはできません。一方、JoinColumnはデータベースの列を識別します。したがって、null許容や一意などの「通常の」属性を使用できます


おかげで、私は試しましたが、残念ながら列にpackage_idはまだNull-はい、デフォルト-NULLのフラグが付けられています。どんな助けでも大歓迎です。
グレモ2012

5
気にしないでください、二重引用符は完全に事を壊します。それはnullable="false"間違っています!
グレモ2012

データベースを完全に削除して、新しく作成しましたか?私はデータベースを見て(上記と同じJoinColumnアノテーションを使用)、NotNullのフラグが立てられています!
Sgoettschkes 2012年

5
このおかげで、私は@ORM\Column(nullable=true)多対多をヌルにすることができなかったのかと思っていました!
Scott Flack 2013年

正しいオプションを設定しても、データベースの列に誤った値が表示される場合は、Entity Managerのメタデータキャッシュをクリアしてください。Symfonyでは、console doctrine:cache:clear-metadataコマンドを使用できます
Massimiliano Arione '24
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.