Điều chắc chắn. Điều đầu tiên cần hiểu là không có "một cách" để làm điều này. Doctrine cung cấp nhiều tính linh hoạt về cách bạn define the relationship - ngay cả khi nhiều định nghĩa tạo ra cùng một DDL (và điều này rất quan trọng để hiểu - một số lựa chọn ánh xạ chỉ ảnh hưởng đến phía đối tượng của ORM, chứ không phải phía mô hình)
Dưới đây là người dùng/nhóm/Quyền ví dụ của bạn, mà thực sự là tất cả nhiều-nhiều hiệp hội (tôi loại trừ tất cả không liên quan nhưng cần mã, như định nghĩa cột 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 {}
Nếu bạn có câu hỏi về những gì đang xảy ra ở đây, hãy cho tôi biết.
Bây giờ, với ví dụ thứ hai của bạn
<?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 {}
Như trước đây, cho tôi biết nếu bạn muốn bất kỳ điều này giải thích.
P.S. Không ai trong số này đã được thử nghiệm thực sự, tôi chỉ kinda đập nó ra trong IDE của tôi thực sự nhanh chóng. Có thể có lỗi đánh máy hoặc hai lỗi;)
Tại sao inverseJoinColumns? – vinnylinux
Ngoài ra, tại sao các tên bảng khác nhau?Và should'nt permission_id được khai báo? – vinnylinux
@vinnylinux - Tôi hoàn toàn không nhận được câu hỏi của bạn. inverseJoinColumns chỉ là cách bạn khai báo một mối quan hệ nhiều-một-nhiều chiều - không có "lý do" để trả lời - đó chỉ là cách nó được thực hiện. Và tôi không hiểu câu hỏi thứ hai của bạn là gì. –