我想知道在Doctrine2中使用多对多关系的最好,最干净,最简单的方法是什么.
让我们假设我们有一张专辑,如Metallica的Master of Puppets,有几首曲目.但请注意,一首曲目可能会出现在一张专辑中,比如Metal by Metallica的专辑 - 三张专辑都是这首曲目.
所以我需要的是专辑和曲目之间的多对多关系,使用第三个表和一些额外的列(比如指定专辑中曲目的位置).实际上,我必须使用,如Doctrine的文档所示,实现该功能的双重一对多关系.
/** @Entity() */
class Album {
/** @Id @Column(type="integer") */
protected $id;
/** @Column() */
protected $title;
/** @OneToMany(targetEntity="AlbumTrackReference", mappedBy="album") */
protected $tracklist;
public function __construct() {
$this->tracklist = new \Doctrine\Common\Collections\ArrayCollection();
}
public function getTitle() {
return $this->title;
}
public function getTracklist() {
return $this->tracklist->toArray();
}
}
/** @Entity() */
class Track {
/** @Id @Column(type="integer") */
protected $id;
/** @Column() */
protected $title;
/** …Run Code Online (Sandbox Code Playgroud) 我有:两个具有非定向M:M关联的实体.
class ShareInfo
{
// ...
/**
* @ORM\ManyToMany(targetEntity="Item")
* @ORM\JoinTable(name="share_info_items",
* joinColumns={@ORM\JoinColumn(name="share_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="id")})
*
* @var Item[]
*/
private $items;
}
class Item
{
// ...
// This entity has no association with ShareInfo,
// because M:M is undirectional and defined in ShareInfo entity
}
Run Code Online (Sandbox Code Playgroud)
我想要的: 从items表(Item实体)中选择数据,其中Item和ShareInfo之间至少存在一个M:M记录.
我的建议不起作用(我有语义错误):
$queryBuilder
->select('i')
->from(Item::class, 'i')
->innerJoin(ShareInfo::class, 'shareInfo', 'WITH', 'shareInfo.items = i');
Run Code Online (Sandbox Code Playgroud)
在纯SQL中我会做这样的事情:
SELECT i.*
FROM items i
INNER JOIN share_info_items shareInfo
ON shareInfo.item_id = i.id
Run Code Online (Sandbox Code Playgroud)
不能相信没有DQL模拟.我能想象的唯一解决方案是将非定向M:M关联分成双向
PS这个问题没有重复,我检查得很好.
我有“客户”,“产品”和“版本”表。每个客户可以有多个产品,每个产品有多个版本。我创建了多对多关系“ customers_products”,并且一切正常。
我还创建了“产品”和“版本”之间的一对多关系。
问题:如何在“ customers_products”表中添加额外的列(version_id),以便我可以建立表单,用户可以在其中选择产品和版本以创建新客户。
我想创建一个通知系统。有一个Notification班级。一条通知可以分配给多个用户,而不仅仅是一个。
有一个联合表user_notifications,有两列:user_id和notification_id
$notifications用户类中的定义是这样的:
/**
* @ManyToMany(targetEntity="Notification")
* @JoinTable(name="user_notifications",
* joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="notification_id", referencedColumnName="id", unique=true)}
* )
**/
private $notifications;
Run Code Online (Sandbox Code Playgroud)
一切正常。但我想在表中添加一个新列user_notifications,无论给定用户是否读取通知,我都想在该表中存储该新列。我应该如何在 Doctrine2 中管理它?
我正在实现一个包含两个实体的系统:产品和类别。我想在这两个实体之间创建多对多关系,但我不想在 Doctrine 中使用多对多选项。我希望能够自己创建中间表(产品类别),以便以后我也可以访问该表。我应该如何定义这三个表之间的关系?(考虑到我的项目中产品和类别之间的关系是多对多的)。带有学说 ORM 注释的简单演示示例非常受欢迎,所以我不会弄错。非常感谢。最佳实践是什么?