2012-07-03 18 views
7

エンティティ間のリレーションシップの作成について説明するとき、ドキュメントが非常に貧弱であることがわかります。だから、私は私の仲間StackExchangersに助けを求める必要があります。だから、私は次のような場合を構築しようとしている:SymfonyとDoctrineでManyToManyとOneToManyを使う方法は?

ケース1

Userは、一つ以上のGroupに属し、Groupは多くのPermissionを持つことができます。 UserPermissionを持つことができます。

Ticketケース2 Category、複数Tagと複数Commentを有しています。

ありがとうございます!

答えて

17

確かです。最初に理解しなければならないことは、これを行う "一方的な方法"がないということです。 Doctrineはあなたのやり方に関して多くの柔軟性を提供しますdefine the relationship - 複数の定義がまったく同じ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 {} 

である、あなたのユーザ/グループ/パーミッションの例です何が起こっているのか、私に教えてください。

今、あなたの第二の例に

<?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 {} 

前と同じように、あなたは、このいずれかを説明したい場合は私に知らせてください。

P.S.これは実際にテストされたものではありません。私はちょうど私のIDEで本当に速くそれを試してみました。タイプミスまたは2つの可能性があります;)

+0

なぜinverseJoinColumnsですか? – vinnylinux

+0

また、異なるテーブル名はなぜですか?permission_idを宣言してはいけませんか? – vinnylinux

+1

@vinnylinux - 私は完全にあなたの質問を得ることはありません。 inverseJoinColumnsは、単方向の多対多の関係を宣言する方法です。答えが「なぜ」なのか、ということはまさにそれです。そして、私はあなたの第二の質問がまったく何かを得ることはありません。 –

4

はこれを試してみてください:

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

あなたがUserGroupの間に多くの関係への一つを持っています。.. targetEntityがあなたとの関係を持っていたいエンティティへのパスで、mappedByはから変数でありますエンティティ。GroupcascadeUserこれは関係の予備側であるGroupに追加し、Group

クラスグループ{

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

から削除することができます。.. targetEntityがバックでUserある親エンティティへのパスを持っているべきであることを意味しますこの場合。 inversedByは、Userエンティティの変数です。 JoinColumnはDoctrineに何を結合するかを伝えるだけですが、これは自分で設定しないと自動的に行われます。

+0

あなたは説明できますか? – MDrollette

関連する問題