確かです。最初に理解しなければならないことは、これを行う "一方的な方法"がないということです。 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つの可能性があります;)
なぜinverseJoinColumnsですか? – vinnylinux
また、異なるテーブル名はなぜですか?permission_idを宣言してはいけませんか? – vinnylinux
@vinnylinux - 私は完全にあなたの質問を得ることはありません。 inverseJoinColumnsは、単方向の多対多の関係を宣言する方法です。答えが「なぜ」なのか、ということはまさにそれです。そして、私はあなたの第二の質問がまったく何かを得ることはありません。 –