我是Synfony2和学说用法的初学者。我创建了两个实体如下:
对于EndUser实体(FOSUserBundle的扩展名):
/**
* EndUser
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Core\CustomerBundle\Entity\EndUserRepository")
*/
class EndUser extends BaseUser {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Core\GeneralBundle\Entity\Discipline", mappedBy="endusers")
*/
private $discipline;
和纪律实体
class Discipline {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToMany(targetEntity="Core\CustomerBundle\Entity\EndUser", inversedBy="discipline")
*/
private $endusers;
当我做"php app/console doctrine:schema:update -- force
时,
EndUser
,Discipline
和discipline_enduser
表已创建。
当我通过phpmyadmin运行标准SQL请求时:
select t0.*
from
discipline t0,
discipline_enduser t2
where
t2.enduser_id = 1
and
t2.discipline_id = t0.id
我获得了预期结果作为特定用户的纪律列表。
我关心的是如何使用Symfony2&amp ;;的实体来实现相同的功能。教义
答案 0 :(得分:0)
您真正需要做的就是修改您的EndUser实体以包含以下内容:
use Doctrine\Common\Collections\ArrayCollection;
class EndUser extends BaseUser
{
private $discipline;
public function __construct()
{
$this->discipline = new ArrayCollection();
}
public function setDiscipline($discipline)
{
$this->discipline = $discipline;
return $this;
}
public function getDiscipline()
{
return $this->discipline;
}
}
然后同样修改Discipline,用endUser代替纪律。
无需创建中间实体。学说已经明白了。干净,嗯?!
答案 1 :(得分:0)
首先,我建议为您的关系使用更多自然语言名称,例如disciplines
和endUsers
,因为它是manyToMany
键。此外,您需要为每个方法创建get
和set
方法。为实体准备好所有属性后,应该运行命令Generate your getters and setters
//this will generate all entities
php app/console doctrine:generate:entities BundleNamespace
之后,您可以执行以下操作:
$endUser->getDisciplines(); //return all disciplines of this user
$endUser->addDiscipline($someDiscipline); //add another discipline
$endUser->removeDiscipline($iAmABadDiscipline); //remove this discipline from this user
array $disciplines = [ ... ];
$endUser->setDisciplines($disciplines); // set multiple disciplines
同样的逻辑适用于Discipline
实体,当然您应该使用EntityManager
更新它们,您可以在答案here中阅读更多内容。
答案 2 :(得分:0)
为了使事情更加连贯,将您的班级成员重命名为$ disciplines(它是多对多的,因此可能有多个学科)。然后,您需要实体中的setter和getter来访问这些规则。
一种方法是在命令行上执行此操作:
php app/console doctrine:generate:entities YourBundle:EndUser
这将为您的班级添加所需的方法。未修改的类文件版本在EndUser.php中备份〜以防万一被覆盖。
完成此操作后,您可以调用getter来获取学科:
$disciplines = $anEndUser->getDisciplines();
例如在控制器方法中:
public function someAction()
{
$anEndUser = $this
->getDoctrine()
->getManager()
->getRepository('YourBundle:EndUser')
->find(1)
;
$disciplines = $anEndUser->getDisciplines();
}