Apabila bekerja dengan pertanyaan pangkalan data mentah yang kompleks dalam Laravel, parameter pengikatan adalah penting untuk mengelakkan ralat. Keadaan ini sering timbul apabila menggunakan pendekatan berasaskan model.
Pertimbangkan pertanyaan berikut yang dihadapi oleh pengguna:
$property = Property::select( DB::raw("title, lat, lng, ( 3959 * acos( cos( radians(:lat) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(:lng) ) + sin( radians(:lat) ) * sin( radians( lat ) ) ) ) AS distance", ["lat" => $lat, "lng" => $lng, "lat" => $lat]) ) ->having("distance", "<", $radius) ->orderBy("distance") ->take(20) ->get();
Pertanyaan ini cuba menapis sifat berdasarkan jaraknya dari titik tertentu menggunakan pengiraan SQL mentah. Walau bagaimanapun, ralat berlaku kerana parameter nama dan kedudukan bercampur.
Untuk menyelesaikan isu ini, seseorang harus memanfaatkan kaedah setBindings, yang membolehkan untuk menentukan pengikatan pertanyaan secara eksplisit. Berikut ialah kod yang diubah suai dan berfungsi:
$property = Property::select( DB::raw("title, lat, lng, ( 3959 * acos( cos( radians( ? ) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians( ? ) ) * sin( radians( lat ) ) ) ) AS distance") ) ->having("distance", "<", "?") ->orderBy("distance") ->take(20) ->setBindings([$lat, $lng, $lat, $radius]) ->get();
Dengan menggunakan ruang letak kedudukan (?) dalam SQL mentah dan menggunakan setBindings dengan tatasusunan nilai yang sesuai, pertanyaan dilaksanakan dengan betul, mengikat parameter kepada ruang letak yang sesuai .
Atas ialah kandungan terperinci Bagaimana untuk Mengikat Parameter dengan Betul dalam Pertanyaan Mentah Kompleks dalam Laravel?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!