web-dev-qa-db-ja.com

DoctrineのArrayCollection :: existsメソッドを使用する方法

EmailエンティティがArrayCollectionにすでに存在するかどうかを確認する必要がありますが、電子メールを文字列として確認する必要があります(エンティティにはIDと他のエンティティとの関係が含まれています。すべてのメールを保持する別のテーブルを使用する理由)。

さて、最初に私はこのコードを書きました:

    /**
     * A new Email is adding: check if it already exists.
     *
     * In a normal scenario we should use $this->emails->contains().
     * But it is possible the email comes from the setPrimaryEmail method.
     * In this case, the object is created from scratch and so it is possible it contains a string email that is
     * already present but that is not recognizable as the Email object that contains it is created from scratch.
     *
     * So we hav to compare Email by Email the string value to check if it already exists: if it exists, then we use
     * the already present Email object, instead we can persist the new one securely.
     *
     * @var Email $existentEmail
     */
    foreach ($this->emails as $existentEmail) {
        if ($existentEmail->getEmail()->getEmail() === $email->getEmail()) {
            // If the two email compared as strings are equals, set the passed email as the already existent one.
            $email = $existentEmail;
        }
    }

しかし、ArrayCollectionクラスを読んで、私はメソッド exists を見ました。これは、私がしたのと同じことをより洗練された方法のようです。

しかし、私はそれを使用する方法がわかりません:上記のコードを与えられたこのメソッドの使用方法を誰かが私に説明できますか?

14
Aerendir

もちろん、PHP a Closure は単純な Anonymous functions です。次のようにコードを書き直すことができます。

    $exists =  $this->emails->exists(function($key, $element) use ($email){
        return $email->getEmail() === $element->getEmail()->getEmail();
        }
    );

この助けを願っています

22
Matteo

@Matteoありがとうございます!

完全を期すために、これは私が思いついたコードです:

public function addEmail(Email $email)
{
    $predictate = function($key, $element) use ($email) {
        /** @var  Email $element If the two email compared as strings are equals, return true. */
        return $element->getEmail()->getEmail() === $email->getEmail();
    };

    // Create a new Email object and add it to the collection
    if (false === $this->emails->exists($predictate)) {
        $this->emails->add($email);
    }

    // Anyway set the email for this store
    $email->setForStore($this);

    return $this;
}
2
Aerendir