如何在同一个Doctrine2对象上插入或更新

时间:2015-06-29 12:54:39

标签: php symfony doctrine-orm symfony-2.6

我有这段代码:

$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;

    ...
}

在DB级别还需要一些其他列(在实体级别为nullable = false),我的问题是:如果对象不存在于DB中,它将根据我编写的代码创建或更新或者我需要将每个必填字段移动到有条件的?实现这一目标的正确方法是什么?我正在尝试根据一个查询结果INSERT|UPDATE进行操作

1 个答案:

答案 0 :(得分:3)

如果您从db检索对象,则doctrine本身知道下一个操作是更新还是插入:您不必担心任何事情

你的答案是有效的,但我会按如下方式修改

$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控件

下添加适当的代码