Doctrine2,在持久化之前更新一些数据

时间:2012-07-18 08:03:46

标签: doctrine-orm persist

我正在使用Doctrine2开发我的php软件。使用它很简单,但我有一点问题,我知道在这种情况下最好的做法是什么。也许你可以帮助我!你将全部感激:-D

情况:

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

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

有问题:

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

  • 如果此联系人的mainContact = 1,则与之关联的所有其他联系人 用户可以更新为mainContact = 0
  • 如果此联系人的mainContact = 0,我需要检查所有其他联系人 联系人。如果我找不到与mainContact = 1的任何其他联系人 这个用户,我自动更新当前的联系人 setMainContact(真)。

可能的解决方案:

我知道如何处理这个逻辑,但我想知道最好的做法是为了做一个好的代码,因为这个应用程序将是一个开源应用程序。

不干净的想法:

  • 在Contact Repository中创建一个将更新所有内容的方法 其他联系人分配给用户并返回值 属于当前联系人。

使用此解决方案,我必须始终启动存储库方法,以便在应用程序周围保持联系。如果我忘了启动它,数据库完整性应该受到损害。

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

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

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

PS:抱歉我的英语很差!

1 个答案:

答案 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;
}