У меня есть сущность User со связанной с ней сущностью «многие ко многим» (Wish), теперь мне нужны 10 лучших желаний, используя Symfony QueryBuilder.
Проблема здесь в том, что у меня нет прямого доступа к таблице/объекту/репозиторию ManyToMany, поскольку он автоматически создается и управляется Doctrine ORM.
Создание вручную OneToMany, ManyToOne Entity на самом деле не вариант, поскольку он нарушит существующий код (в основном автоматическое заполнение коллекций и его функции добавления/удаления)
Выполнение ручного SQL довольно хитро, так как имя таблицы генерируется и может изменить некоторые обновления (даже если нет, я бы предпочел сохранить его в чистоте)
некоторый код:
class User {
// .........
/**
* @ORM\ManyToMany(targetEntity = "App\Entity\Wish")
*/
private $wish;
public function __construct()
{
$this->wish = new ArrayCollection(); // with get/set/add/remove etc
}
}
class Wish {
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type = "integer")
*/
private $id;
/**
* @ORM\Column(type = "string", length=255)
*/
private $name;
// ... get set etc
}
@hoover_D как мне это сделать? соответствующие данные находятся в таблице отношений «user_wish», и у меня нет ни сущности, ни репозитория.
проверьте здесь документацию для сопоставления отношений symfony.com/doc/current/doctrine/associations.html, когда вы сделаете настройки. Будет проще сделать свой пользовательский репозиторий, здесь документы для него symfony.com/doc/3.3/doctrine/repository.html
@hoover_D, если я что-то не упустил, это не решает мою проблему. у меня уже есть все это, но поскольку это автоматические отношения «многие ко многим», похоже, что таблицы соединений не существует. есть ли какой-нибудь (псевдо) код, который может прояснить ситуацию?
Наа, ты видишь это не с той стороны. Вам не нужно работать напрямую с таблицей соединений, Doctrine сделает это за вас. Таким образом, вы можете написать для него специальный геттер в User Entity. Скопируйте Getter для желаний внутри вашего User Entity и переименуйте его во что-то вроде «getWishesTopTen». Затем вы переписываете этот геттер так, чтобы он не выдавал вам все пожелания, а применял критерии, чтобы выдавать только 10 лучших. Критерии см. в этом руководстве (в примере это OneToMany-Relation, но он работает и с ManyToMany): symfonycasts.com/screencast/collections/…
@BenjaminKozlowski дело в том, что дело не в пользователе. это примерно 10 лучших в мире. У меня нет пользователя, поэтому я борюсь, потому что мне не хватает точки входа для получения данных.
Ах хорошо. Итак, как определяется «Топ-10»?
@BenjaminKozlowski определяется с помощью чего-то вроде SELECT wish_id, count(wish_id) AS c FROM user_wish GROUP BY wish_id в операторе sql в таблице соединений.
Итак, вам нужны пожелания, которые имеют наибольшее количество пользователей. Итак, сначала вам нужно добавить пользователей в свой Wish Entity. Тогда вы могли бы их посчитать. Взгляните сюда: gist.github.com/Окрамиус/3121916 Затем вы можете написать запрос для Wishes, который подсчитывает пользователей, связанных с ним.
я понимаю. я был против разоблачения пользователей в пожелании, но это хороший аргумент и может сработать, попробую завтра
@BenjaminKozlowski, да, это не работает. что бы я ни делал, я не могу заставить построитель запросов принять выбор пользователей. сейчас я буду использовать статический SQL-запрос






вы должны заявить о своем отношении к учению, чтобы оно с ним справилось. В этом случае вы, безусловно, можете создать собственный репозиторий и создать запрос DQL, чтобы ограничить ваши результаты до 10.