How to use the Doctrine ArrayCollection :: exists method

I need to check if the Email object already ArrayCollection in the ArrayCollection , but I have to check the email as strings (Entity contains an identifier and some relationships with other persons, for this reason I use a separate table that saves all emails).

Now, in the first, I wrote this 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; } } 

But after reading the ArrayCollection class, I saw the exists method, which seems to be a more elgetic way to do the same thing as I did.

But I do not know how to use it: can someone explain to me how to use this method, given the above code?

+6
source share
2 answers

Of course, in PHP Closure is a simple anonymous function . You can rewrite your code as follows:

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

Hope for this help

+9
source

Thanks @Matteo!

Just for completeness, this is the code I came with:

 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; } 
+1
source

Source: https://habr.com/ru/post/1011545/


All Articles