我正在使用Doctrine2开发我的php软件。使用它很简单,但我有一点问题,我知道在这种情况下最好的做法是什么。也许你可以帮助我!你将全部感激:-D
情况:
我有2个实体(用户和联系人)
有问题:
当我坚持联系时,我喜欢这样:
可能的解决方案:
我知道如何处理这个逻辑,但我想知道最好的做法是为了做一个好的代码,因为这个应用程序将是一个开源应用程序。
不干净的想法:
使用此解决方案,我必须始终启动存储库方法,以便在应用程序周围保持联系。如果我忘了启动它,数据库完整性应该受到损害。
不推荐使用此方法,实体永远不应直接访问实体管理器。
谁能告诉我这样做的最佳做法是什么?非常感谢你!
PS:抱歉我的英语很差!
答案 0 :(得分:0)
你可以在这里做的最好的事情(从纯粹的OOP角度来看,甚至没有持久性逻辑)是在你的实体的setter中实现这个逻辑。毕竟,逻辑并不重要,User
不会有很多contacts
,操作也不会经常发生。
<?php
class User
{
protected $contacts;
// constructor, other fields, other methods
public function addContact(Contact $contact)
{
if ($this->contacts->contains($contact)) {
return;
}
if ($contact->isMainContact()) {
foreach ($this->contacts as $existingContact) {
$existingContact->setMainContact(false);
}
$this->contacts->add($contact);
$contact->setUser($this); // set the owning side of the relation too!
return;
}
$mainContact = true;
foreach ($this->contacts as $existingContact) {
if ($existingContact->isMainContact()) {
$mainContact = false;
break; // no need for further checks
}
}
$contact->setMainContact($mainContact);
$this->contacts->add($contact);
$contact->setUser($this); // set the owning side of the relation too!
}
}
另一方面,请考虑向用户添加字段:
<?php
class User
{
// keep reference here instead of the contact (cleaner)
protected $mainContact;
}