1

我正在使用 Doctrine2 开发我的 php 软件。使用它非常简单,但我有一个小问题,我会知道在这种情况下什么是最佳实践。也许你可以帮助我!你会得到我所有的感激:-D

情况 :

我有 2 个实体(用户和联系人)

  • 一个用户可以包含一些联系人
  • 实体(表)联系人有一个标记为 mainContact 的字段,该字段定义它是否是用户的主要联系人。
  • 只有一个联系人可以是主要联系人(mainContact=1)

有问题的:

当我坚持联系时,我会喜欢这样:

  • 如果此联系人的 mainContact=1,则与该用户关联的所有其他联系人都应更新为 mainContact=0
  • 如果此联系人的 mainContact=0,我需要检查所有其他联系人。如果我没有找到该用户的 mainContact=1 的任何其他联系人,我会自动使用 setMainContact(true) 更新当前联系人。

可能的解决方案 :

我对如何处理这个逻辑有一些想法,但我想知道为了编写好的代码的最佳实践,因为这个应用程序将是一个开源应用程序。

不干净的想法:

  • 在联系人存储库中创建一个方法,该方法将更新分配给用户的所有其他联系人,并将值返回给当前联系人的属性。

使用此解决方案,我必须始终先启动存储库方法才能在应用程序周围保持联系。如果我忘记启动它,数据库完整性应该会受到影响。

  • 使用实体的 Prepersist 机制获取实体管理器并更新所有其他用户的联系人。

不推荐使用此方法,实体不应直接访问实体管理器。

谁能告诉我这样做的最佳做法是什么?非常感谢你 !

PS:对不起我的英语不好!

4

1 回答 1

0

您可以在这里做的最好的事情(从纯 OOP 的角度来看,甚至没有持久性逻辑)是在实体的设置器中实现此逻辑。毕竟,考虑到 aUser不会有很多的逻辑并不重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;
}
于 2012-07-18T11:39:21.477 回答