Решение 1:Doctrine Native SQL
Един от начините да постигнете това е чрез използване на собствени MySQL заявки. Това изисква използването на Нативния SQL на Doctrine функция и картографиране на резултатите от заявката с помощта на ResultSetMapping .
Попаднах на проблем при изпълнение на собствена SQL заявка два пъти (с различни параметри), че наборът от резултати на втората заявка беше същият като първия.Следна публикация в GitHub реши това вместо мен.
Решение 2:Използване на вътрешния оптимизатор на MySQL
Използването на следното условие за присъединяване ще използва вътрешния оптимизатор на MySQL и ще третира това като ref_or_null
тип присъединяване
SELECT a.*, b.*
FROM a
INNER JOIN b ON
a.column = b.column
OR (a.column IS NULL AND b.column IS NULL)
След това е възможно да се използва това условие за присъединяване в DQL, което ще бъде добре преведено в SQL, за да бъде оптимизирано.
Решение 3:Напишете персонализирана DQL функция
Написах персонализирана DQL-функция, която се превежда в следната клауза:
SELECT a.*, b.*
FROM a
INNER JOIN b ON (a.column <=> b.column) = 1
За съжаление не успяхме да се отървем от = 1
част от тази клауза. Това проработи, но предизвика майор въздействие върху производителността върху моята заявка:17s срещу 0,5s, за да дам някаква (ненаучна) индикация.
Така че не отидох по-нататък по този път.