2015-06-29 2 views
-2

У меня есть этот кусок кода:Как выпрямить вставку или обновление на одном объекте Doctrine2

$entity = $em->getRepository('AppBundle:Representative')->find($soqlObj1['records'][0]['Id']); 

if ($entity === null) { 
    $entity = new Representative(); 
    $em->persist($entity); 
} 

// we set the values from veeva 
$entity->setVeevaRepId($soqlObj1['records'][0]['Id']); 
$entity->setEmail($soqlObj1['records'][0]['Email']); 
... 

$em->flush(); 

И это часть лица Representative:

class Representative 
{ 
    /** 
    * @ORM\Id() 
    * @ORM\Column(type="string", length=45, nullable=false, unique=true) 
    * @ORM\GeneratedValue() 
    * @Expose() 
    */ 
    protected $veeva_rep_id; 

    /** 
    * @var string 
    * @ORM\Column(type="string", length=45) 
    * @Expose() 
    */ 
    protected $display_name; 

    /** 
    * @var string 
    * @ORM\Column(type="string", length=255) 
    * @Expose() 
    */ 
    protected $avatar_url = 'https://pdone.s3.amazonaws.com/avatar/default_avatar.png'; 

    /** 
    * @var string 
    * @ORM\Column(type="string", length=45) 
    * @Expose() 
    */ 
    protected $rep_type = "VEEVA"; 

    /** 
    * @var string 
    * @ORM\Column(type="string", length=45) 
    * @Expose() 
    */ 
    protected $username; 

    /** 
    * @var string 
    * @ORM\Column(type="string", length=45) 
    * @Expose() 
    */ 
    protected $first; 

    /** 
    * @var string 
    * @ORM\Column(type="string", length=45) 
    * @Expose() 
    */ 
    protected $last; 

    /** 
    * @var string 
    * @ORM\Column(type="string", length=45, nullable=true) 
    * @Expose() 
    */ 
    protected $title; 

    /** 
    * @var string 
    * @ORM\Column(type="text", nullable=true) 
    */ 
    protected $bio; 

    /** 
    * @var string 
    * @ORM\Column(type="string", length=45, nullable=true) 
    * @Expose() 
    */ 
    protected $phone; 

    /** 
    * @var string 
    * @ORM\Column(type="string", length=45) 
    * @Expose() 
    */ 
    protected $email; 

    /** 
    * @var bool 
    * @ORM\Column(type="boolean") 
    * @Expose() 
    */ 
    protected $inactive = false; 

    /** 
    * @var \DateTime 
    * @ORM\Column(type="datetime", nullable=true) 
    * @Expose() 
    */ 
    protected $lastLoginAt; 

    /** 
    * @var \DateTime 
    * @ORM\Column(type="datetime") 
    * @Expose() 
    */ 
    protected $lastSyncAt; 

    /** 
    * @var Territory 
    * @ORM\ManyToOne(targetEntity="Territory") 
    * @ORM\JoinColumn(name="territories_id", referencedColumnName="veeva_territory_id") 
    * @Expose() 
    */ 
    protected $territory; 

    /** 
    * @var string 
    * @ORM\Column(type="string", nullable=true, length=150) 
    */ 
    protected $repTokenId; 

    ... 
} 

Есть несколько других столбцов, требуются на уровне БД (nullable = false на уровне сущности), мой вопрос: если объект не существует в БД, он будет создан или обновлен на основе кода, который я написал, или мне нужно переместить каждое обязательное поле в условное? Каков правильный способ достичь этого? Я пытаюсь сделать INSERT|UPDATE на основе только одного результата запроса

+0

Возможно, я не понимаю вопроса: не является ли ограничение столбца действительны в обеих ситуациях? – DonCallisto

+0

@DonCallisto, что вы имеете в виду? Я не буду следовать за тобой, может быть, яснее? – ReynierPM

+0

Нет, не могли бы вы быть более ясными? : P Я имею в виду, в чем проблема. Почему вы указываете, что это «несколько других столбцов, для которых требуется уровень DB DB»? Что означает «Переместить каждое обязательное поле в условное?» – DonCallisto

ответ

3

Если извлечь объект из БД, учение само по себе знает, что если следующая операция будет обновление или вставка: вам не придется беспокоиться ни о чем

вашего ответа является допустимым, но я бы изменить его следующим образом

$entity = $em->getRepository('AppBundle:Representative')->find($soqlObj1['records'][0]['Id']); 

if ($entity === null) { 
    $entity = new Representative(); 
} 

// we set the values from veeva 
$entity->setVeevaRepId($soqlObj1['records'][0]['Id']); 
$entity->setEmail($soqlObj1['records'][0]['Email']); 

$em->persist($entity); 
$em->flush(); 

Как я уже говорил, вам не придется беспокоиться о вставке или обновлении, доктрина сделает это за вас. Однако, если вам нужно установить определенные значения только в том случае, если объект является новым или если он был извлечен из db, просто добавьте правильный код под $entity === null control

+0

Ок, thx, имея это, я спрошу вас: 'setEmail()' требуется для обоих: INSERT или UPDATE, в этом случае вы будете писать одну и ту же строку дважды? Один внутри элемента '$ entity === null' (для INSERT) и второй снаружи (для UPDATE)? – ReynierPM

+1

@ReynierPM: если вам нужно установить новое значение в обоих случаях, я поставлю определенно один раз, прямо перед продолжением объекта. В другом случае, конечно, я бы написал только, имел ли он смысл: P – DonCallisto

Смежные вопросы