创建一个新实体,并立即更新另一个实体

时间:2013-03-04 19:37:31

标签: datetime symfony orm doctrine-orm symfony-2.1

我对此进行了大量搜索,认真询问是我最后的资源,学说是在努力踢我。

我有一个名为“合同”的实体和另一个“请求”,一个合同可能有多个请求,在添加新请求时我会搜索该客户的现有合同并将其关联(如果已存在)或创建它(如果不存在)。

在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;
}

1 个答案:

答案 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的一切。