在Symfony2中,使用Doctrine,我有两个实体:Job和User。
我遵循了学说文档,并想出了如何映射ManyToOne和OneToMany关系。
这是我的用户类:
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity
*/
class User extends BaseUser
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
//it has all the necessary fields (username, pass and so on) and the ones related to Job entity:
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Job", mappedBy="user")
* @Type("AppBundle\Entity\Job")
**/
protected $jobs;
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->jobs = new ArrayCollection();
}
/**
* @return ArrayCollection
*/
public function getJobs()
{
return $this->jobs;
}
/**
* @param $jobs
*/
public function setJobs($jobs)
{
$this->jobs = $jobs;
}
/**
* {@inheritdoc}
*/
public function addJob(Job $job)
{
$this->jobs->add($job);
$job->setUser($this);
}
/**
* {@inheritdoc}
*/
public function removeJob(Job $job)
{
$this->jobs->removeElement($job);
}
另一方面,我有这样写的Job实体:
/**
* Job
*
* @ORM\Table(name="hr_job")
* @ORM\Entity
* @ORM\Entity(repositoryClass="AppBundle\Repo\JobRepository")
* @HasLifecycleCallbacks
*/
class Job
{
/**
* @var integer
*
* @Type("integer")
* @ORM\Column(name="job_id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
//other properties go here (title, description and email)
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="jobs")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true)
* @Expose
* @Type("AppBundle\Entity\User")
**/
protected $user;
/**
* @return mixed
*/
public function getUser()
{
return $this->user;
}
/**
* @param mixed $user
*/
public function setUser($user)
{
$this->user = $user;
}
在控制器中,我为登录用户添加了一个Job,它插入就好了。它有一个与适当用户相关的user_id外键。
但是,当我尝试让该用户添加所有作业时,会出现问题。
出于某种原因,$ user-> getJobs()始终为空。它表现得很奇怪。我尝试在php中转储它,我什么都没得到。我试着把它倾倒在树枝上,我得到的PersistentCollection对象对我来说并不意味着什么。
任何想法我做错了什么?
编辑:这是我的控制器代码。序列化已正确完成。
$serializer = SerializerBuilder::create()->build();
$jobJSON = $request->getContent();
$loggedInUser = $this->getUser();
$jobClassObject = $serializer->deserialize($jobJSON, "AppBundle\Entity\Job", "json");
$jobClassObject->setUser($loggedInUser);
//$loggedInUser->addJob($jobClassObject);
$em = $this->getDoctrine()->getManager();
$em->persist($jobClassObject);
$em->flush();
答案 0 :(得分:2)
In the documentation你可以读到:
Doctrine只会检查协会的拥有方是否有变更。
here详细说明:
要完全理解这一点,请记住在对象世界中如何维护双向关联。关联的每一侧有2个引用,这两个引用都代表相同的关联,但可以彼此独立地改变。当然,在正确的应用程序中,双向关联的语义由应用程序开发人员正确维护(这是他的职责)。 Doctrine需要知道这两个内存引用中的哪一个应该是持久化的,哪些不是。这就是拥有/反向概念主要用于。
因此,您有责任处理反面,这意味着您在设置拥有方时必须也更新反面:
/**
* @param mixed $user
*/
public function setUser($user)
{
$this->user = $user;
$user->addJob($this);
}
答案 1 :(得分:1)
您需要在User实体类中实现addJob()/ removeJob()方法。