web-dev-qa-db-fra.com

Comment utiliser la méthode ArrayCollection :: exist de Doctrine

Je dois vérifier si une entité Email existe déjà dans le ArrayCollection mais je dois effectuer la vérification des e-mails sous forme de chaînes (l'entité contient un ID et quelques relations avec d'autres entités, pour cela raison pour laquelle j'utilise un tableau séparé qui conserve tous les e-mails).

Maintenant, dans le premier, j'ai écrit ce code:

    /**
     * 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;
        }
    }

Mais en lisant la classe ArrayCollection, j'ai vu la méthode exists qui semble être une façon plus élégante de faire la même chose que moi.

Mais je ne sais pas comment l'utiliser: quelqu'un peut-il m'expliquer comment utiliser cette méthode compte tenu du code ci-dessus?

14
Aerendir

Bien sûr, en PHP a Fermeture est un simple Fonctions anonymes . Vous pouvez réécrire votre code comme suit:

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

J'espère que cette aide

22
Matteo

Merci @Matteo!

Juste pour être complet, voici le code avec lequel j'ai trouvé:

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