2016-09-12 17 views
0

私は2つのエンティティ、UserとLicense、およびブリッジエンティティUserLicenseを持っています。 ユーザーとライセンスの関連付けはManytoManyです。 ORMアノテーションを次のように定義しましたが、問題があります。データベースにユーザーとライセンスを保存すると、UserLicenseにアップグレードされたことを示すデータがありません。Doctrine注釈、ブリッジエンティティが機能しないようです

User.php

/** 
* @ORM\Column(type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* @ORM\OneToMany(targetEntity="UserLicense", mappedBy="user_id") 
*/ 
private $id; 

License.php

/** 
* @ORM\Column(type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* @ORM\OneToMany(targetEntity="UserLicense", mappedBy="license_id") 
*/ 
private $id; 

間違って何UserLicense.php

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="id") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
private $user_id; 

/** 
* @ORM\ManyToOne(targetEntity="License", inversedBy="id") 
* @ORM\JoinColumn(name="license_id", referencedColumnName="id") 
*/ 
private $license_id; 

答えて

1

は、余分なフィールド

であなたは、エンティティ間の関係をしなければならない、との教義は、それらを管理、関係が多対多で、コメントを参照してください。 あなたは教義に言います、私はユーザーとユーザーの間の関係が欲しいです。 Doctrineは右のフィールドで結合列を管理していますが、デフォルトの値はほとんどの場合、このアノテーションは削除できます: @ORM \ JoinColumn(name = "user_id"、referencedColumnName = "id")

これを試してください:

User.php

/** 
* @ORM\Column(type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* 
*/ 
private $id; 

/* 
*@ORM\OneToMany(targetEntity="UserLicense", mappedBy="user") 
*/ 
private $userLicence; 

License.php

/** 
* @ORM\Column(type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* 
*/ 
private $id; 

/* 
* @ORM\OneToMany(targetEntity="UserLicense", mappedBy="license") 
*/ 
private $userLicence; 

UserLicense.php

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="userLicence") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
private $user; 

/** 
* @ORM\ManyToOne(targetEntity="License", inversedBy="userLicence") 
* @ORM\JoinColumn(name="license_id", referencedColumnName="id") 
*/ 
private $license; 

- コメントの前にまず答え---

私はあなたが何をしたいのかを正しく理解していれば、あなただけのセットアップにユーザーとライセンスの関係を持っています。

Doctrineは、関係を処理するために必要なデータベーステーブルを管理します。 あなたはそれについて心配する必要はありません。

ユーザーが多くのライセンスを持つことができ、ライセンスは多くのユーザーが所有することができ、あなたがこれを行うことができます:

User.php

/** 
* @ORM\Column(type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* 
*/ 
private $id; 
/* 
* @ORM\ManyToMany(targetEntity="License", mappedBy="user") 
*/ 
private $licence; 

Lincence.php

/** 
* @ORM\Column(type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/* 
* @ORM\ManyToMany(targetEntity="User", ReversedBy="license") 
* 
*/ 
private $user; 

プライベート$ユーザー;

$ licenseと$ userのセッターとゲッターを追加する必要があります。ユーザーにライセンスを追加すると、Doctrineはその関連付けを行います。あなたは()をフラッシュする必要があり、後

$licence = new Licence(); 
$user->addLicence($licence); 

よう

何か。

これは単なるコード例ですが、実装方法は作業内容によって異なります。

いくつかの良いリソース:この1つは多対多関係を理解するのに最適です https://knpuniversity.com/screencast/symfony2-ep3/many-to-many-relationship

必読: http://doctrine-orm.readthedocs.io/en/latest/reference/association-mapping.html

をあなたは持っているしたい場合は、教義能力が=「EAGER」フェッチを参照する必要がありますいくつかのケースでは関連するエンティティ、そしてArrayCollectionについて読む

+0

関係は多岐にわたる。ユーザーは多数のライセンスを所有でき、1つのライセンスは多数のユーザーに関連付けることができます。 –

+0

私はmanyToManyのために変更しますが、ポイントは次のとおりです:let Doctrineはリレーションを管理します。データベースではなくORMで考える必要があります。 'UserLicence'に追加のフィールドがない限り、ニコラス@ – Nicolas

+0

です。 –

関連する問題