我基于Doctrine的后端应用程序具有实体类型Lead
和Contact
。一个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方法。在这一点上,我也想知道如果我自己实现它是否可行。还是会导致副作用,尤其是当我稍后将线索对象再次存储到数据库时?我担心会出现重复联系人之类的副作用,并在为时已晚时注意到它们。这就是为什么我在这里问...