Saya mempunyai jadual dengan lajur JSON jenis teks panjang (DC2Type:json). Jadual mempunyai entiti dalam ORM Doktrin dalam projek Symfony saya. Saya ingin membuat pertanyaan berdasarkan medan dalam lajur JSON menggunakan pembina pertanyaan Doktrin dalam pembolehubah $qb
Apa yang perlu saya lakukan? Semua yang saya temui dalam talian mengatakan untuk memasang pakej pihak ke-3 untuk mendayakan ciri ini. Adakah terdapat cara untuk melakukannya menggunakan hanya pembina pertanyaan Doctrine tanpa memasang pakej lain?
Satu penyelesaian (mungkin bodoh) yang saya cuba ialah menganggap lajur sebagai rentetan dan...
$qb->andWhere("my_data LIKE "%id:\"1,%"");
Sebagai contoh, jika saya ingin menanyakan lajur JSON my_data
以查找字符串中包含 id":1,
untuk gumpalan. Ini gagal dengan ralat sintaks yang sangat pelik, dan bukan cara yang betul untuk menanyakan medan JSON. Walau bagaimanapun, melaksanakan pertanyaan LIKE secara terus dalam klien SQL berfungsi seperti yang saya mahukan, jadi saya tidak tahu mengapa ini gagal dalam Doktrin sama ada.
EDIT: Ini adalah MySQL/MariaDB.
Bahasa pertanyaan doktrin adalah sangat terhad. Ia hanya merangkumi fungsi SQL yang paling asas/biasa, yang cukup untuk 99% kes penggunaan, tetapi bukan semua.
Jika versi MariaDB anda secara asli menyokong JSON (cth. 10.2 atau lebih tinggi), anda boleh menggunakan fungsi asli untuk memproses data JSON. (Jika anda tidak, maka penyelesaian anda ialah satu-satunya pilihan dan mungkin memerlukan beberapa penapisan tambahan dalam aplikasi).
Untuk dapat menggunakan fungsi ini dalam DQL, anda perlu takrifkannya sendiri atau memang menggunakan perpustakaan pihak ketiga seperti scienta/doctrine-json-functions (perhatikan bahawa terdapat dokumentasi tentang cara menggunakannya dengan Symfony, Dan ia sangat mudah).
Jika anda hanya memerlukan satu fungsi tambahan dan tidak memerlukan keseluruhan pakej atas sebab tertentu, anda boleh menyalin kelas tunggal itu dan menggunakannya sebagai milik anda.
Sebagai alternatif, anda boleh membuang DQL dan menulis SQL secara terus, tetapi kemudian anda tidak akan dapat secara langsung bergabung menjadi objek dan menggunakan sihir Doktrin lain untuk memproses data. Tetapi untuk kes penggunaan mudah ini sudah cukup.