我已经对此进行了很多搜索,并且认真地询问是我的最后一个资源,教义让我很难受。
我有一个名为“合同”的实体和另一个“请求”,一个合同可能有多个请求,当添加一个新请求时,我搜索该客户的现有合同,如果已经存在则关联它,如果不存在则创建它。
在 RequestRepository.php 中:
public function findOrCreate($phone)
{
$em = $this->getEntityManager();
$contract = $this->findOneBy(array('phone' => $phone));
if($contract === null)
{
$contract = new Contract();
$contract->setPhone($phone)
->setDesDate(new \DateTime());
# save only if new
$em->persist($contract);
}
return $contract;
}
问题是,当合同是新合同时,它可以正常工作,但是当从数据库“重用”时,我无法修改它的属性。我已经检查了 OneToMany 和 ManyToOne。
在 Contract.php 中:
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\OneToMany(targetEntity="Request", mappedBy="contract")
*/
private $id;
在 Request.php 中:
/**
* @var string
*
* @ORM\JoinColumn(nullable=false)
* @ORM\ManyToOne(targetEntity="Cid\FrontBundle\Entity\Contract", inversedBy="id", cascade={"persist"})
*/
protected $contract;
我还有一个方法可以修改 Contract.php 中的属性:
public function addTime($months)
{
$days = $months * 30;
$this->des_date->add(new \DateInterval("P".$days."D"));
return $this;
}
我创建了请求并“findOrCreate”了一个合同,但如果后者不是“新鲜的”,则 addTime 不会保存到数据库。
我究竟做错了什么?
编辑:控制器是一个常见的 CRUD,稍作修改。
不要担心“请求”名称冲突,实际代码是西班牙语,Request = Solicitud
public function createAction(Request $req)
{
$entity = new Request();
$form = $this->createForm(new RequestType(), $entity);
$form->bind($req);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$entity->setUser($this->getUser());
$data = $request->request->get('cid_frontbundle_requesttype');
$phone = $data['phone_number'];
$reqRep = $em->getRepository('FrontBundle:Request');
$entity = $reqRep->newRequest($entity, $phone);
return $this->redirect($this->generateUrl('request_show', array('id' => $entity->getId())));
}
return $this->render('FrontBundle:Request:new.html.twig', array(
'entity' => $entity,
'form' => $form->createView(),
));
}
新请求:
public function newRequest($request, $phone)
{
$em = $this->getEntityManager();
$contractRep = $em->getRepository('FrontBundle:Contract');
$contract = $contractRep->findOrCreate($phone);
$contract->addTime(123); # this is the problem, I use var_dump and this method works, but doesn't persists
$em->persist($request);
$em->flush();
return $request;
}