如何使用非主键在Doctrine中插入或更新

时间:2018-03-21 12:54:45

标签: doctrine

我有一个表,列(Id,client_id ...)

我需要使用非primaryKey client_id作为唯一的插入或更新...

if client_id exist
   INSERT.....
else
   UPDATE.....WHERE client_id = X

我使用的是学说,我的代码就像这样

$em = getEntityManager();
            $programaFidelidade = new ProgramaFidelidadeClientes;
            $programaFidelidade->setIdCliente($param['idCliente']);
            $programaFidelidade->setIdProgramaFidelidade($param['programa']);

            $em->merge($programaFidelidade);
            $em->flush();

我的实体是这样的:

     /**
    * @Column(name="id", type="integer", nullable=false)
    * @Id
    * @GeneratedValue(strategy="IDENTITY")
    */
   private $id;

   /**
    * @Column(name="id_cliente", type="integer")
    */
   private $idCliente;

由于

抱歉我的英文

@EDIT(工作代码)

$programaFidelidade =  $em->getRepository(ProgramaFidelidadeClientes::class)->findBy(['idCliente' => $param['idCliente']]);

            if($programaFidelidade == null){
                $programaFidelidade = new ProgramaFidelidadeClientes;
                $programaFidelidade->setIdCliente($param['idCliente']);
                $programaFidelidade->setIdProgramaFidelidade($param['programa']);
                $em->merge($programaFidelidade);
            }else{
                $programaFidelidade[0]->setIdCliente($param['idCliente']);
                $programaFidelidade[0]->setIdProgramaFidelidade($param['programa']);
                $em->merge($programaFidelidade[0]);
            }
            $em->flush();
            $this->retorno_json(true, true);

1 个答案:

答案 0 :(得分:0)

通常我会这样做:

$em = getEntityManager();

$programaFidelidade = $em->getRepository('AppBundle:ProgramaFidelidadeClientes')->find($param['idCliente']);

if (null == $programaFidelidade) {
   $programaFidelidade = new ProgramaFidelidadeClientes;
   $programaFidelidade->setIdCliente($param['idCliente']);
   $programaFidelidade->setIdProgramaFidelidade($param['programa']);

   $em->merge($programaFidelidade);
   $em->flush();
} else {
   $programaFidelidade->setIdCliente($param['idCliente']);
   $programaFidelidade->setIdProgramaFidelidade($param['programa']);

   $em->merge($programaFidelidade);
   $em->flush();
}

我已经使用名称和命名空间调用存储库,如下所示:AppBundle:ProgramaFidelidadeClientes但我不知道在您的应用中是否有另一个包或不同的名称。