Saya memiliki modul yang nakal. EFQ mempertahankan hasil yang tidak terduga, tetapi saya tidak bisa melihat mengapa hanya dengan melihat kode. Apakah ada dpq () yang setara untuk EFQ? Cara lain untuk men-debug mereka?
27
Saya memiliki modul yang nakal. EFQ mempertahankan hasil yang tidak terduga, tetapi saya tidak bisa melihat mengapa hanya dengan melihat kode. Apakah ada dpq () yang setara untuk EFQ? Cara lain untuk men-debug mereka?
Jawaban:
Ini sedikit hack, tetapi Anda bisa menambahkan tag ke apa pun yang
EntityFieldQuery
Anda tertarik untuk mencetak kueri, kemudian menerapkannyahook_query_alter()
untuk mencegatnya ketika itu adalah standarSelectQuery
, lalu melemparkannya ke string untuk debugging:Ini sedikit hack tetapi melakukan trik. Output untuk di atas adalah:
Agaknya ini juga hanya akan berfungsi ketika menggunakan MySQL sebagai sistem penyimpanan lapangan.
sumber
hook_query_alter()
query bukanEntityFieldQuery
lagi, sudah dikonversi ke standardb_select()
, jadi__tostring()
berfungsi dengan sangat baik :) Sejak mengerjakan ini saya sudah menggunakannya cukup banyak dan bekerja cukup baikhook_query_alter()
.Daripada memutar hook_query_alter Anda sendiri (), Anda dapat membiarkan modul Devel melakukan pekerjaan berat untuk Anda dengan menambahkan
debug
tag:Ini akan mencetak kueri ke layar, sama seperti
dpq()
akan.sumber
Menambah jawaban @Clive, yang umumnya mencetak kueri dengan placeholder yang tidak sesuai dengan nilainya. Untuk mencetak nilai dengan kueri gunakan kode berikut di bawah hook_query_alter.
Ini bukan praktik yang baik untuk menginstal modul untuk beberapa baris kode. Itu sebabnya saya memilih solusi yang disebutkan di atas.
sumber
Jika Anda mengunduh versi bagus dari DPQ Bagus (atau apa pun => 1.1), Anda dapat melakukannya:
dan Anda akan mendapatkan kueri dpm'ed dengan baik :). Bagian penting dalam kode di atas adalah addTag ('nicedpq') - yang memicu
dpm()
.sumber
Anda dapat mencoba men-debug-nya melalui XDebug . Setelah terinstal, lakukan
xdebug_start_trace()
sebelum kode, danxdebug_stop_trace()
setelah itu, maka Anda akan memiliki log jejak yang jelas apa yang dieksekusi dan di mana.Anda juga dapat mengaktifkan logger kueri dalam konfigurasi MySQL.
Metode lainnya adalah dengan menggunakan strace / truss / dtruss seperti debuggers.
Contoh menggunakan dtruss:
semua pertanyaan
pertanyaan spesifik
Perhatikan bahwa
dtruss
ini hanyalah skrip yang menggunakan DTrace, sehingga Anda dapat mempertimbangkan implementasi langsung probe statis PHP DTrace atau DTracing MySQL dengan menulis skrip Anda sendiri.Baca selengkapnya: Melakukan debug lanjutan pada inti Drupal menggunakan baris perintah (strace & tcpdump)
sumber
Tambahkan fungsi ini ke modul Anda. Kemudian, tambahkan tag
debug
ke EFQ apa pun. Membutuhkan modul Devel diaktifkan untuk mencetak kueri.sumber