我想实现这种关系:
类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;
}
答案 0 :(得分:1)
首先删除 $ 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();
答案 1 :(得分:1)
您正在寻找与连接表的单向一对多关系,该连接表在学说中使用@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)。
通过连接表here了解关于关联映射的更多信息。