@TexElless
Backend-разработчик(преимущественно PHP и Symfony)

Как правильно получить часть данных из отношения в Symfony?

Есть 3 таблицы.

user (id, username, email, etc.)
group (id, name)
membership (id, user_id, group_id, role)

У пользователя и группы указаны ManyToMany аннотации.
Мне нужно реализовать метод getOwner() у группы, который вернет пользователя, имеющего соответствующую роль.
Как это лучше сделать? Взять всех пользователей через аннотации и фильтровать на стороне пхп, сделать отдельный запрос без аннотаций или можно аннотациями как-то это сделать?
В гугле не забанен, просто даже не знаю как это загуглить.
  • Вопрос задан
  • 309 просмотров
Решения вопроса 2
@jaxel
Для данных случаев можно использовать метод matching у ArrayCollection. Передаём туда подготовленный объект Criteria, с помощью которого настраиваем нужную фильтрацию. Когда мы будем дёргать метод getOwner выполнится запрос, который получит только нужные нам данные, не получая все связанные записи.
use Doctrine\Common\Collections\Criteria;

/**
 * @ORM\Entity
 */
class Group {
  // ...
  public function getOwner() {
    $criteria = Criteria::create()->where(фильтруем по роли или что-то ещё);

    return $this->getUsers()->matching($criteria); 
  }
}
Ответ написан
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Не касаясь того, насколько правильно у вас это с архитектурной точки зрения, могу сказать, что вы можете в методе getOwner() выбрать именно то, что вам нужно воспользовавшись фильтрацией по критерию в коллекции.
Взять всех пользователей через аннотации и фильтровать на стороне пхп, сделать отдельный запрос без аннотаций или можно аннотациями как-то это сделать?

А вот здесь вы просто глупости говорите. Аннотации - это всего лишь один из синтаксисов описания маппинга сущности. Почитайте документацию Doctrine, чтобы лучше понять, с чем имеете дело.
В гугле не забанен, просто даже не знаю как это загуглить.

Почитайте документацию по Doctrine ORM. В ней достаточно важных моментов, которые лучше узнать до начала работы, чтобы потом не переписывать всё, когда узнаете о них.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
RUVENTS Москва
от 120 000 до 140 000 ₽
TRUECODE Омск
от 130 000 до 160 000 ₽
Networks Санкт-Петербург
от 70 000 до 100 000 ₽
03 авг. 2020, в 12:50
800 руб./в час
03 авг. 2020, в 12:19
3000 руб./за проект