LINUX.ORG.RU

Doctrine many-many производительность

 


0

1

Есть 2 энтити которые соеденены через таблицу «flags_to_menus» Использую аннотацию многие ко многим. Все работает, всё вытягивает.

    /**
     * Many menus have Many flags.
     * @Serializer\Groups({«API_tree»})
     * @Serializer\SerializedName(«flags»)
     * @ORM\ManyToMany(targetEntity=«FlagLibrary»)
     * @ORM\JoinTable(name=«flags_to_menus»,
     *      joinColumns={@ORM\JoinColumn(name=«menu_id», referencedColumnName=«menu_id»)},
     *      inverseJoinColumns={@ORM\JoinColumn(name=«flag_id», referencedColumnName=«id»)}
     *      )
     */
    private $flags = [];

Но есть проблема - генерируется куча SQL такого вида:

SELECT t0.id AS id_1, t0.entity_type AS entity_type_2, t0.entity_id AS entity_id_3, t0.title AS title_4, t0.storage_name AS storage_name_5 FROM master_flag_library t0 INNER JOIN master_flags_to_menus ON t0.id = master_flags_to_menus.flag_id WHERE master_flags_to_menus.menu_id = 22054

Соответсвтенно на каждую запись из энтити Menu генерится такой запрос. 10000 тыс записей - столько же и запросов.

В доках, на форумах уже все что можно перерыл и не нашел решения.

Есть идеи как это справить?

★★

PHP не знаю, но, судя по симптомам, ошибка известная. У тебя выполняется один запрос, который достаёт N записей (менюшек). Затем где-нибудь (при рендеринге), например, в цикле для каждей из этой менюшки выполняется запрос на получение связанных записей (флагов), которые ты и видишь в логах (всего N запросов). Итого получается N+1 запросов, отсюда распространённое название этой ошибки — «N+1 Queries».

Гугли решение по ключевым словам «ТВОЯ_ORM + n+1 queries» «ТВОЯ_ORM + eager loading».

theNamelessOne ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.