8

エンティティ間の関係の作成について説明する場合、ドキュメントは非常に貧弱です。それで、仲間の StackExchanger に助けを求めなければなりません。だから、私は次のケースを構築しようとしています:

ケース1

AUserは 1 つ以上の に属し、 A は複数Groupの を持つGroupことができますPermission。AUserも を持つことができますPermission

ケース 2

ATicketには a Category、 multiple Tag、および multipleがありますComment

前もって感謝します!

4

2 に答える 2

17

確実なこと。最初に理解することは、これを行うための「1つの方法」がないということです。Doctrineは、関係を定義する方法に関して多くの柔軟性を提供します-複数の定義がまったく同じDDLを生成する場合でも(これを理解することが重要です-マッピングの選択の一部は、モデルではなく、ORMのオブジェクト側にのみ影響します-側)

これがユーザー/グループ/権限の例です。これは実際にはすべて多対多の関連付けです(PK列の定義など、関連性はないが必須のコードはすべて除外しました)

<?php

namespace Your\Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 */
class User
{
  /**
   * Many-To-Many, Unidirectional
   *
   * @var ArrayCollection $groups
   *
   * @ORM\ManyToMany(targetEntity="Group")
   * @ORM\JoinTable(name="user_has_group",
   *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
   *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
   * )
   */
  protected $groups;

  /**
   * Many-To-Many, Unidirectional
   *
   * @var ArrayCollection $permissions
   *
   * @ORM\ManyToMany(targetEntity="Permission")
   * @ORM\JoinTable(name="user_has_permission",
   *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
   *      inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")}
   * )
   */
  protected $permissions;

  public function __construct()
  {
    $this->groups = new ArrayCollection();
    $this->permissions = new ArrayCollection();
  }
}

/**
 * @ORM\Entity
 */
class Group
{
  /**
   * Many-To-Many, Unidirectional
   *
   * @var ArrayCollection $permissions
   *
   * @ORM\ManyToMany(targetEntity="Permission")
   * @ORM\JoinTable(name="group_has_permission",
   *      joinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")},
   *      inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")}
   * )
   */
  protected $permissions;

  public function __construct()
  {
    $this->permissions = new ArrayCollection();
  }
}

/**
 * @ORM\Entity
 */
class Permission {}

ここで何が起こっているのかについて質問があれば、私に知らせてください。

さて、あなたの2番目の例に

<?php

namespace Your\Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 */
class Ticket
{
  /**
   * Many-To-One, Unidirectional
   *
   * @var Category
   *
   * @ORM\ManyToOne(targetEntity="Category")
   * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
   */
  protected $category;

  /**
   * Many-To-Many, Unidirectional
   *
   * @var ArrayCollection $permissions
   *
   * @ORM\ManyToMany(targetEntity="Tag")
   * @ORM\JoinTable(name="tickt_has_tag",
   *      joinColumns={@ORM\JoinColumn(name="ticket_id", referencedColumnName="id")},
   *      inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")}
   * )
   */
  protected $tags;

  /**
   * One-To-Many, Bidirectional
   *
   * @var ArrayCollection $comments
   *
   * @ORM\OneToMany(targetEntity="Comment", mappedBy="ticket")
   */
  protected $comments;

  public function __construct()
  {
    $this->tags = new ArrayCollection();
    $this->comments = new ArrayCollection();
  }
}

/**
 * @ORM\Entity
 */
class Comment
{
  /**
   * Many-To-One, Bidirectional
   *
   * @var Ticket $ticket
   *
   * @ORM\ManyToOne(targetEntity="Ticket")
   * @ORM\JoinColumn(name="ticket_id", referencedColumnName="id")
   */
  protected $ticket=null;
}

/**
 * @ORM\Entity
 */
class Tag {}

/**
 * @ORM\Entity
 */
class Category {}

以前と同様に、これについて説明したい場合はお知らせください。

PSこれは実際にはテストされていません。IDEで非常に高速に実行しました。タイプミスが1つか2つあるかもしれません;)

于 2012-07-03T21:10:25.237 に答える
4

これを試して:

Class User {  
 /**
  * @ORM\OneToMany(targetEntity="path\to\group", mappedBy="user", cascade={"persist", "remove"})
  */
  private $group;

との間に一対多の関係がUserありGroupます。targetEntityは関係を持ちたいエンティティへのパスであり、 はエンティティmappedByからの変数ですGroup。 追加および削除できるcascade手段UserGroupGroup

クラス グループ {

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

これはリレーションシップの予約側です。この場合targetEntity、親エンティティに戻るパスが必要です。エンティティからの変数です。何に参加するかを Doctrine に指示するだけです。自分で設定しなければ、これは自動的に行われます。UserinversedByUserJoinColumn

于 2012-07-03T19:48:38.417 に答える