[英]Doctrine 2 - entity have collection of another entities via key holder table
我想實現這種類型的關系:
類SimpleUser必須具有“languages”類屬性,該屬性應包含綁定到UserLanguages表中當前用戶的所有SimpleLanguage-s的列表。
請查看課程:
public class SimpleUser {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=50)
*/
private $name;
// what do I type here? I want to have SimpleLanguage[] here
private $languages;
}
public class SimpleLanguage {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=50)
*/
private $name;
}
public class UserLanguages {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var integer
* @ORM\Column(name="user_id", type="integer")
*/
private $userId;
/**
* @var integer
* @ORM\Column(name="language_id", type="integer")
*/
private $languageId;
/**
* @var SimpleUser
*
* @ManyToOne(targetEntity="SimpleUser")
* @JoinColumn(name="userId", referencedColumnName="id")
*/
private $user;
/**
* @var SimpleLanguage
*
* @ManyToOne(targetEntity="SimpleLanguage")
* @JoinColumn(name="languageId", referencedColumnName="id")
*/
private $language;
}
首先刪除$ userId; 和你的班級UserLanguages的$ languageId ! 它們是無用的,這些是屬性$ user和$ language,它們管理數據庫中實體的id!
這里是如何管理SImpleUser中的語言屬性:
use Doctrine\Common\Collections\ArrayCollection;
// ...
class SimpleUser
{
//...
/**
* @ORM\OneToMany(targetEntity="UserLanguages", mappedBy="user")
*/
protected $languages;
public function __construct()
{
$this->languages = new ArrayCollection();
}
}
類似於SimpleLanguage:
use Doctrine\Common\Collections\ArrayCollection;
// ...
class SimpleLanguage
{
//...
/**
* @ORM\OneToMany(targetEntity="UserLanguages", mappedBy="language")
*/
protected $languages;
public function __construct()
{
$this->languages = new ArrayCollection();
}
}
編輯:
我想沒有“UserLanguages”的集合,而是直接從“user_languages”表中收集“SimpleLanguage”
好的,目前這是不可能的,我認為想要一個ManyToMany關系而不是第三個實體UserLanguages(你的問題不是很清楚)!
刪除無用的實體UserLanguages,然后在SimpleUser中:
use Doctrine\Common\Collections\ArrayCollection;
// ...
class SimpleUser
{
//...
/**
* @ORM\ManyToMany(targetEntity="SimpleLanguage", mappedBy="users")
*/
protected $languages;
public function __construct()
{
$this->languages = new ArrayCollection();
}
}
而SimpleLanguage:
use Doctrine\Common\Collections\ArrayCollection;
// ...
class SimpleLanguage
{
//...
/**
* @ORM\ManyToMany(targetEntity="SimpleUser", mappedBy="languages")
* @JoinTable(name="UserLanguages")
*/
protected $users;
public function __construct()
{
$this->users = new ArrayCollection();
}
}
這將導致第三個表UserLanguages具有user_id和language_id!
您將能夠從用戶類獲取與一次使用鏈接的所有語言的列表:
$languages = $user->getLanguages();
反向語言:
$users = $language->getUsers();
您正在尋找與連接表的單向一對多關系,該連接表在學說中使用@ManyToMany注釋進行描述。 這可能會導致混淆。
你根本不需要粘合UserLanguages類... doctrine會為你處理這個表。
SimpleUser
/**
* @ORM\ManyToMany(targetEntity="SimpleLanguage", inversedBy="user")
* @ORM\JoinTable(name="UserLanguages",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="language_id", referencedColumnName="id", unique=true)}
* )
*/
protected $languages;
SimpleLanguage
/**
* @ORM\ManyToMany(targetEntity="SimpleUser", mappedBy="languages")
*/
protected $user;
現在doctrine將為您創建UserLanguages表並保留id(user_id,language_id)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.