1

Doctrine2を使用してphpソフトウェアを開発しています。それを使用するのは非常に簡単ですが、少し問題があり、その状況でのベストプラクティスは何かを知っています. 多分あなたは私を助けることができます! あなたは私の感謝の気持ちをすべて持っているでしょう:-D

状況 :

2 つのエンティティ (ユーザーと連絡先) があります。

  • ユーザーにはいくつかの連絡先を含めることができます
  • エンティティ (テーブル) Contacts には、それがユーザーの主要な連絡先であるかどうかを定義する mainContact というラベルの付いたフィールドがあります。
  • 1 つの連絡先のみを主連絡先にすることができます (mainContact=1)

問題あり:

連絡先を保持するときは、次のようにします。

  • この連絡先に mainContact=1 がある場合、ユーザーに関連付けられている他のすべての連絡先は mainContact=0 に更新する必要があります
  • この連絡先が mainContact=0 の場合、他のすべての連絡先を確認する必要があります。このユーザーの mainContact=1 の連絡先が他に見つからない場合は、現在の連絡先を setMainContact(true) で自動的に更新します。

可能な解決策 :

このロジックを処理する方法はある程度わかっていますが、このアプリケーションはオープン ソース アプリケーションであるため、適切なコードを作成するためのベスト プラクティスを知りたいと考えています。

きれいではないアイデア :

  • ユーザーに割り当てられた他のすべての連絡先を更新し、現在の連絡先の属性に値を返すメソッドを連絡先リポジトリに作成します。

このソリューションでは、アプリケーション全体で連絡先を保持する前に、常にリポジトリ メソッドを起動する必要があります。起動するのを忘れた場合、データベースの整合性が損なわれるはずです。

  • エンティティから Prepersist メカニズムを使用して、entitymanager を取得し、他のすべてのユーザーの連絡先を更新します。

このメソッドは推奨されません。エンティティはエンティティ マネージャに直接アクセスしないでください。

そうするためのベストプラクティスは何ですか?どうもありがとうございました !

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 に答える