【问题标题】:How to right insert or update on same Doctrine2 object如何在同一个 Doctrine2 对象上正确插入或更新
【发布时间】:2015-06-29 12:54:38
【问题描述】:

我有这段代码:

$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

【问题讨论】:

  • 也许我不明白这个问题:列约束不是在这两种情况下都有效吗?
  • @DonCallisto 你是什么意思?我没跟着你,你能说清楚点吗?
  • 不,你能说清楚一点吗? :P 我的意思是,有什么问题。为什么您指定“DB LEVEL 所需的其他列很少”? “将每个必填字段移入条件”是什么意思?
  • @DonCallisto 我现在通过在Representative 上添加所有字段来更新 OP,正如您所看到的,有一些可以为空,而其他则不是我的怀疑,如何只使用一个查询来处理这个问题,简而言之:如果记录存在则更新它,如果不创建,这就是我想要做的,你现在明白了吗?
  • 不,抱歉,我无法理解您在这里要做什么。让我解释一下:教义2照顾自己的“插入或更新”情况。我问你的是,如果有必填字段,重要的是要知道你是否处于另一种情况?我的意思是,如果是强制性的,它应该始终存储一个值。还是我错了?

标签: php symfony doctrine-orm symfony-2.6


【解决方案1】:

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

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

$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 控件下添加适当的代码

【讨论】:

  • 好的,谢谢,有这个我会问你:setEmail() 两者都需要:INSERT 或 UPDATE,在这种情况下你会写两次同一行?一个在$entity === null 控件内部(用于插入),第二个在外部(用于更新)?
  • @ReynierPM:如果你必须在两种情况下都设置一个新值,我肯定会放一次,就在对象持久化操作之前。当然,在其他情况下,我只会在有意义的情况下写:P
猜你喜欢
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多