0

私はこのシナリオを持っています

私は4つのクラスがあります

User
profiles
Activity
Workbook

user can have many profiles based on per year. Every year diff profile
User profile will have many to many with Activities

したがって、profile_idとactivity_idを持つprofile_activitiesテーブルがあります

これで、ユーザーはプロファイルごとのアクティビティごとに1つのワークブックを実行します

だから私はデータベースにマッピングする方法が混乱しています

私はプロファイルテーブルのために、私は持つことができます

class profile


@many to many
protected $activities

many to one
protected $user

しかし、クラスワークブックでは、アクティビティとプロファイルの関係テーブルに属する外部キーを定義する方法

すべての活動について、子供はワークブックを完成させる必要があります。それをどのように定義すればよいですか

@[one to one [PK of activity_profile table]

protected $workbook

4

1 に答える 1

2

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列、クラスについて話す場合は属性)が関係するかを伝える(注釈を確認する)属性です。関係(外部キー)に。targetEntityinversedBy

/**
 * @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")はであることが示されています。UserUsergroups

doctrine:generate:entities Acmeこれで、エンティティ生成のdoctrineコマンドをdb php app / consoleで実行できます。ここで、Acmeはバンドルの名前であり、トリックが実行されます。

mappedByinversedBy:_

  • 「2つの」側面があります:逆さまの側面と所有する側面。docrineは所有側にのみ変更を「観察」することを忘れないでください。したがって、適切なクラスに配置するように注意してください。
  • 反転側はmappedByキーワードで識別され、その値は所有側クラスの名前です
  • 所有側はinversedByキーワードで識別され、その値は逆側クラスの名前です
  • manyToOneアソシエーションには常に所有側があります
  • oneToManyの関連付けには、常に逆の側面があります
  • oneToOne関係の所有側は、常に外部キーを持つエンティティです。
  • 多対多の関係は同じです
于 2012-07-18T07:40:31.863 に答える