Подтвердить что ты не робот

Правильный способ проверить, существует ли отношение "многие ко многим" - Symfony2/Doctrine

Предположим, что у меня есть две сущности User и Product, связанные отношением Many-to-Many с Doctrine.

Я хотел бы знать, как наилучшим образом обрабатывать метод $user- > hasProduct ($ product) для моего объекта User, который возвращает true, существует отношение или false, если нет.

В настоящее время я делаю это:

public function hasProduct($id)
{
    foreach($this->getProducts() as $product) {
        if($product->getId() == $id) {
            return true;
        }
    }

    return false;
}

Но я не уверен, что это лучший способ, особенно если в цикле много отношений.

Если у кого-то есть что-то лучше, дайте мне знать:)

4b9b3361

Ответ 1

Ваша функция getProducts дает вам ArrayCollection.

Просто сделай

if($user->getProducts()->contains($product)) //the real product object not the id
       //your stuff

Изменить:

Для шаблона ветки:

{% if product in user.products %}
    //your stuff
{% endif %}

Ответ 2

Я боролся с той же проблемой и наткнулся на эту запись в блоге, которая решила эту проблему, используя фильтры Doctrine.

Если я правильно понимаю вашу проблему и у вас есть три таблицы (пользователь, user_product и продукт), вы должны переписать свою функцию hasProduct ($ id) следующим образом:

use Doctrine\Common\Collections\Criteria;

public function hasProduct(int $productId): bool {

  $criteria = Criteria::create();
  $criteria->where(Criteria::expr()->eq('id', $productId));

  if(count($this->products->matching($criteria)) > 0) {
    return true;
  }

  return false;
}

При запуске этого кода Doctrine не загружает все Продукты, связанные с пользователем. На самом деле он запрашивает только таблицу перекрестных ссылок (user_product).