原则:手动附加关联的收藏集

时间:2019-02-15 07:02:19

标签: php doctrine one-to-many doctrine-query

我基于Doctrine的后端应用程序具有实体类型LeadContact。一个Lead可以有多个Contact。我的问题是我希望将联系人保留在线索对象的$contacts属性中,但是在获取线索时,我已经具有相关的联系人,因为在不同的上下文中我早些时候就需要它们。因此,我想将已经获取的联系人手动附加到新获取的线索对象上。

这是细节问题:

用于获取潜在客户联系人的查询必须考虑一些重要点,例如:

  • 它们必须与当前用户相关(与User有另一个关联)
  • 它不能包含disabled个条目

因此,有一个相应的功能getContactsByLead(),该功能由前端通过Web服务调用:

$qb = $repo->createQueryBuilder('c');
$qb->where($qb->expr()->eq('c.lead', '?0'));
$qb->setParameter(0, $leadId);
$qb->andWhere('c.disabled = 0');
$qb->andWhere($qb->expr()->eq('c.user', '?1'));
$qb->setParameter(1, $this->getUser()->getId()); 
return $qb->getQuery()->execute();

当前还有另一个功能getLeadWithContacts(),应该提供一个Lead对象,而不是将那些联系人存储在其contacts属性中:

/**
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\LeadContact", mappedBy="lead")
 */
protected $contacts;

因此,此功能getLeadWithContacts()包含的查询与getContactsByLead()非常相似,但是却获取了潜在客户,并LEFT JOIN在相同条件下对联系人进行了查询:

$qb = $this->createQueryBuilder('l');
$qb->leftJoin('l.contacts', 'c', Expr\Join::WITH, 'c.disabled = 0');
$qb->addSelect('c');
$qb->where($qb->expr()->eq('l.id', $leadId));
$qb->andWhere($qb->expr()->eq('c.user', '?0'));
$qb->setParameter(0, $this->getUser()->getId()); 
return $qb->getQuery()->getOneOrNullResult();

这是有问题的,因为开发人员必须始终确保两个函数都以相同的方式遵守条件。当条件改变时,开发人员忘记调整其中一个查询时,这已经带来了更大的问题。

这就是为什么我要用以下内容替换getLeadWithContacts()

public function getLeadWithContacts($leadId) {
    $lead = $this->getLead($leadId);
    $contacts = $this->getContactsByLead($lead);
    $lead->setContacts($contacts);
    return $lead;
}

但是,学说并没有为整个系列提供setter方法。在这一点上,我也想知道如果我自己实现它是否可行。还是会导致副作用,尤其是当我稍后将线索对象再次存储到数据库时?我担心会出现重复联系人之类的副作用,并在为时已晚时注意到它们。这就是为什么我在这里问...

0 个答案:

没有答案