Giải pháp 1:Doctrine Native SQL
Một cách để đạt được điều này là sử dụng các truy vấn MySQL gốc. Điều này yêu cầu sử dụng SQL gốc củaDoctrine tính năng và ánh xạ các kết quả của truy vấn bằng ResultSetMapping .
Tôi đã gặp sự cố khi thực thi truy vấn SQL gốc hai lần (với các tham số khác nhau), tập hợp kết quả của truy vấn thứ hai giống với tập hợp đầu tiên. Bài đăng sau trên GitHub đã giải quyết vấn đề này cho tôi.
Giải pháp 2:Sử dụng trình tối ưu hóa nội bộ của MySQL
Sử dụng điều kiện kết hợp sau sẽ sử dụng trình tối ưu hóa nội bộ của MySQL và coi đây là ref_or_null
kiểu tham gia
SELECT a.*, b.*
FROM a
INNER JOIN b ON
a.column = b.column
OR (a.column IS NULL AND b.column IS NULL)
Sau đó, có thể sử dụng điều kiện nối này trong DQL, điều kiện này sẽ được dịch độc đáo trong SQL để được tối ưu hóa.
Giải pháp 3:Viết hàm DQL tùy chỉnh
Tôi đã viết một hàm DQL tùy chỉnh được dịch trong mệnh đề sau:
SELECT a.*, b.*
FROM a
INNER JOIN b ON (a.column <=> b.column) = 1
Rất tiếc là không thể loại bỏ = 1
một phần của điều khoản này. Điều này đã hiệu quả, nhưng gây ra một chính tác động đến hiệu suất đối với truy vấn của tôi:17 giây so với 0,5 giây, để đưa ra một số dấu hiệu (phi khoa học).
Vì vậy, tôi đã không đi xa hơn con đường đó.