symfonyはこの操作を行うためのさまざまな方法を提供します。
それらのメソッドの1つはアノテーションです。アノテーションを使用すると、この関係などをphpクラスに直接書き込むことができます(db列のタイプなど、属性が必須かどうかを指定するなど)。
それで、この例を見てみましょう(私はあなたのエンティティの関係を理解していなかったので)
2つのエンティティを考えてみましょう:ユーザーとグループ。1人のユーザーはn個のグループに
属することができ、グループはm個のユーザーを持つことができます。これは、 mnカーディナリティを関係に「分割」する必要があることを意味します。
symfony(教義あり。mongodbと同様のものが同じかどうかはわかりません)では、この「中間テーブル」をphpクラスとして作成する必要はありません。あなたがしなければならないのは、phpクラスへの注釈を使って、どのテーブルがどのように関連しているかを指定することです。
方法を見てみましょう!m-1-n
/**
* Acme\UserBundle\Entity\User
*
* @ORM\Table(name="users")
* @ORM\Entity()
*/
class User implements AdvancedUserInterface
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
[...]
/**
* @ORM\ManyToMany(targetEntity="Groups", inversedBy="users")
*
*/
private $groups;
[...]
}
ご覧のとおり、これはDoctrine(ORM)を使用してdbテーブルにマップされたphpクラスの一部です。
このクラスは、このクラスと別のクラス(によって識別される)と$groups
の間の多対多の関係であり、どの属性(db列、クラスについて話す場合は属性)が関係するかを伝える(注釈を確認する)属性です。関係(外部キー)に。targetEntity
inversedBy
/**
* @ORM\Table(name="groups")
* @ORM\Entity()
*/
class Groups implements RoleInterface
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
[...]
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="groups")
*/
private $users;
[...]
}
このエンティティはグループエンティティであり、関係の「反対側」が$user
あります。ご覧のとおり、現実化はクラスであり、フィールドからクラスへ@ORM\ManyToMany(targetEntity="User", mappedBy="groups")
はであることが示されています。User
User
groups
doctrine:generate:entities Acme
これで、エンティティ生成のdoctrineコマンドをdb php app / consoleで実行できます。ここで、Acme
はバンドルの名前であり、トリックが実行されます。
mappedBy
とinversedBy
:_
- 「2つの」側面があります:逆さまの側面と所有する側面。docrineは所有側にのみ変更を「観察」することを忘れないでください。したがって、適切なクラスに配置するように注意してください。
- 反転側は
mappedBy
キーワードで識別され、その値は所有側クラスの名前です
- 所有側は
inversedBy
キーワードで識別され、その値は逆側クラスの名前です
- manyToOneアソシエーションには常に所有側があります
- oneToManyの関連付けには、常に逆の側面があります
- oneToOne関係の所有側は、常に外部キーを持つエンティティです。
- 多対多の関係は同じです