0

我已经对此进行了很多搜索,并且认真地询问是我的最后一个资源,教义让我很难受。

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

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

1 回答 1

2

尤里卡!!问题是原则似乎通过引用检查对象,而我对合同所做的只是将 DateInterval 添加到 DateTime 属性,因此对于原则而言,对象是相同的,并且没有保存。这是实现它的代码。

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 所做的一切。

于 2013-03-04T22:21:10.963 回答