我对此进行了大量搜索,认真询问是我最后的资源,学说是在努力踢我。
我有一个名为“合同”的实体和另一个“请求”,一个合同可能有多个请求,在添加新请求时我会搜索该客户的现有合同并将其关联(如果已存在)或创建它(如果不存在)。
在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;
}
问题是,当合同是新的时它可以正常工作,但是当从db“重用”时我无法修改其属性。我已经检查了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不会保存到db。
我做错了什么?
编辑:控制器是一个常见的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(),
));
}
newRequest:
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;
}
答案 0 :(得分:2)
尤里卡!!问题是,学说似乎是通过引用来检查对象,而我在合同中所做的就是在DateTime属性中添加一个DateInterval,因此该对象对于学说的问题是相同的,并且没有保存。这是制作它的代码。
public function addTime($months)
{
$days = $months * 30; # I know DateInterval has months but this is company policy ;)
$other = new \DateTime($this->des_date->format('Y-m-d')); # creating a brand new DateTime did the trick
$other->add(new \DateInterval("P".$days."D"));
$this->des_date = $other;
return $this;
}
感谢@cheesemacfly的一切。