Pembuat kueri FOXDB menggunakan pengikatan parameter PDO untuk melindungi aplikasi Anda terhadap serangan injeksi SQL. Tidak perlu membersihkan atau membersihkan string yang diteruskan ke pembangun kueri sebagai binding kueri.
composer require webriumfoxdb
Konfigurasi
Memilih
Sisipkan pernyataan
Perbarui pernyataan
Hapus pernyataan
Fitur Khusus
Skema
Fasih
use Foxdb DB ;
use Foxdb Config ;
DB :: addConnection ( ' main ' , [
' host ' => ' localhost ' ,
' port ' => ' 3306 ' ,
' database ' => ' test ' ,
' username ' => ' root ' ,
' password ' => ' 1234 ' ,
' charset ' =>Config:: UTF8 ,
' collation ' =>Config:: UTF8_GENERAL_CI ,
' fetch ' =>Config:: FETCH_CLASS
]);Pernyataan
'main'adalah nama default konfigurasi koneksi
Anda dapat menggunakan metode table yang disediakan oleh fasad DB untuk memulai kueri. Metode table mengembalikan instance builder kueri yang lancar untuk tabel yang diberikan, memungkinkan Anda untuk rantai lebih banyak kendala ke kueri dan akhirnya mengambil hasil kueri menggunakan metode GET:
use Foxdb DB ;
$ users = DB :: table ( ' users ' )-> get ();
foreach ( $ users as $ user ) {
echo $ user -> name ;
} Jika Anda hanya perlu mengambil satu baris tunggal dari tabel database, Anda dapat menggunakan metode first DB fasade. Metode ini akan mengembalikan objek STDClass tunggal:
$ user = DB :: table ( ' users ' )-> where ( ' name ' , ' Jack ' )-> first ();
return $ user -> email ; Jika Anda tidak memerlukan seluruh baris, Anda dapat mengekstrak satu nilai dari catatan menggunakan metode value . Metode ini akan mengembalikan nilai kolom secara langsung:
$ email = DB :: table ( ' users ' )-> where ( ' name ' , ' John ' )-> value ( ' email ' ); Untuk mengambil satu baris dengan nilai kolom id -nya, gunakan metode find :
$ user = DB :: table ( ' users ' )-> find ( 3 ); Perbedaan antara metode find dan first adalah bahwa metode first mengembalikan hasil dalam bentuk stdclass jika ada, tetapi metode find mengembalikan hasil dalam bentuk Model , yang memberi kita lebih banyak fitur. (Jika nilainya tidak ada kedua metode mengembalikan false.)
? Dari versi 3 dan di atas, kueri dapat digunakan untuk menemukan
$ user = User:: find ( 3 );
if ( $ user ){
$ user -> name = ' Tom ' ;
$ user -> save (); // update name
}
$ user = User:: where ( ' phone ' , ' 09999999999 ' )-> find ();
if ( $ user ){
$ user -> phone = ' 09999999998 ' ;
$ user -> save (); // update user phone number
} Anda dapat menggunakan metode pluck . Dalam contoh ini, kami akan mengambil kumpulan judul pengguna:
use Foxdb DB ;
$ titles = DB :: table ( ' users ' )-> pluck ( ' title ' );
foreach ( $ titles as $ title ) {
echo $ title ;
}Anda dapat menentukan kolom bahwa koleksi yang dihasilkan harus digunakan sebagai kuncinya dengan memberikan argumen kedua untuk metode Pluck:
$ titles = DB :: table ( ' users ' )-> pluck ( ' title ' , ' name ' );
foreach ( $ titles as $ name => $ title ) {
echo $ title ;
} Jika Anda perlu bekerja dengan ribuan catatan database, pertimbangkan untuk menggunakan metode chunk yang disediakan oleh fasad DB. Metode ini mengambil sebagian kecil hasil sekaligus dan memberi makan setiap potongan menjadi penutupan untuk diproses. Misalnya, mari kita ambil seluruh tabel pengguna dalam potongan 100 catatan sekaligus:
use Foxdb DB ;
DB :: table ( ' users ' )-> orderBy ( ' id ' )-> chunk ( 100 , function ( $ users ) {
foreach ( $ users as $ user ) {
//
}
});Anda dapat menghentikan potongan lebih lanjut dari diproses dengan mengembalikan false dari penutupan:
DB :: table ( ' users ' )-> orderBy ( ' id ' )-> chunk ( 100 , function ( $ users ) {
// Process the records...
return false ;
}); Anda dapat menggunakan each metode.
use Foxdb DB ;
DB :: table ( ' users ' )-> orderBy ( ' id ' )-> each ( function ( $ user ) {
//
});FOXDB telah menciptakan metode sederhana untuk pagination. Dalam contoh di bawah ini, jumlah hasil dibatasi hingga 10 catatan, dan Anda bisa mendapatkan informasi dengan mengubah nomor halaman.
$ page = 1 ;
$ list = DB :: table ( ' posts ' )
-> is ( ' active ' )
-> paginate ( 10 , $ page );Outputnya adalah stdclass yang berisi sifat -sifat berikut:
$ list -> total ; // The total number of rows
$ list -> count ; // The number of rows received on the current page
$ list -> per_page ; // The number of rows to display on each page
$ list -> prev_page ; // Previous page number. If not available, its value is false
$ list -> next_page ; // next page number. If not available, its value is false
$ list -> current_page ; // Current page number
$ list -> data ; // List of data rows Pembuat kueri juga menyediakan berbagai metode untuk mengambil nilai agregat seperti count , max , min , avg , dan sum . Anda dapat menghubungi salah satu dari metode ini setelah membangun pertanyaan Anda:
use Foxdb DB ;
$ users = DB :: table ( ' users ' )-> count ();
$ price = DB :: table ( ' orders ' )-> max ( ' price ' );Tentu saja, Anda dapat menggabungkan metode ini dengan klausa lain untuk menyempurnakan bagaimana nilai agregat Anda dihitung:
$ price = DB :: table ( ' orders ' )
-> where ( ' finalized ' , 1 )
-> avg ( ' price ' );Alih -alih menggunakan metode Count untuk menentukan apakah ada catatan yang sesuai dengan kendala kueri Anda, Anda dapat menggunakan metode yang ada dan tidak mengeksekusi:
if ( DB :: table ( ' orders ' )-> where ( ' finalized ' , 1 )-> exists ()) {
// ...
}
if ( DB :: table ( ' orders ' )-> where ( ' finalized ' , 1 )-> doesntExist ()) {
// ...
}Menentukan Klausul Pilih
Anda mungkin tidak selalu ingin memilih semua kolom dari tabel database. Menggunakan metode select , Anda dapat menentukan klausa "pilih" khusus untuk kueri:
use Foxdb DB ;
$ users = DB :: table ( ' users ' )
-> select ( ' name ' , ' email as user_email ' )
-> get ();
// Or you can send as an array
$ users = DB :: table ( ' users ' )
-> select ([ ' name ' , ' email as user_email ' ])
-> get ();Tetapi ada cara yang lebih modern untuk melakukan ini. Anda dapat bertindak seperti contoh di bawah ini
$ users = DB :: table ( ' users ' )
-> select ( function ( $ query ){
$ query -> field ( ' name ' );
$ query -> field ( ' email ' )-> as ( ' user_email ' );
})
-> get (); Terkadang Anda mungkin perlu memasukkan string sewenang -wenang ke dalam kueri. Untuk membuat ekspresi string mentah, Anda dapat menggunakan metode raw yang disediakan oleh fasad DB :
$ users = DB :: table ( ' users ' )
-> select ( DB :: raw ( ' count(*) as user_count, status ' ))
-> where ( ' status ' , ' <> ' , 1 )
-> groupBy ( ' status ' )
-> get ();Untuk menggunakan parameter dalam mentah seperti contoh di bawah ini
DB::raw('count(?)',['id'])
️ Pernyataan mentah akan disuntikkan ke dalam kueri sebagai string, jadi Anda harus sangat berhati -hati untuk menghindari menciptakan kerentanan injeksi SQL.
Tetapi untuk tujuan ini, lebih baik menggunakan metode berikut untuk menghindari serangan SQL injection
$ users = DB :: table ( ' users ' )
-> select ( function ( $ query ){
$ query -> count ( ' * ' )-> as ( ' user_count ' )
$ query -> field ( ' status ' );
})
-> get (); Dalam struktur ini, Anda memiliki akses ke field , count , sum , avg , min , max , all , as metode.
Alih -alih menggunakan metode DB :: RAW, Anda juga dapat menggunakan metode berikut untuk memasukkan ekspresi mentah ke berbagai bagian kueri Anda. Ingat, FOXDB tidak dapat menjamin bahwa permintaan apa pun yang menggunakan ekspresi mentah dilindungi terhadap kerentanan injeksi SQL.
Metode whereraw dan orwhereraw dapat digunakan untuk menyuntikkan klausa "di mana" mentah ke dalam kueri Anda. Metode -metode ini menerima array binding opsional sebagai argumen kedua mereka:
$ orders = DB :: table ( ' orders ' )
-> whereRaw ( ' price > IF(state = "TX", ?, 100) ' , [ 200 ])
-> get ();Metode Havenraw dan Orhavavraw dapat digunakan untuk memberikan string mentah sebagai nilai klausul "memiliki". Metode -metode ini menerima array binding opsional sebagai argumen kedua mereka:
$ orders = DB :: table ( ' orders ' )
-> select ( ' department ' , DB :: raw ( ' SUM(price) as total_sales ' ))
-> groupBy ( ' department ' )
-> havingRaw ( ' SUM(price) > ? ' , [ 2500 ])
-> get ();Pembuat kueri juga dapat digunakan untuk menambahkan klausa bergabung ke pertanyaan Anda. Untuk melakukan "Join Dalam" dasar, Anda dapat menggunakan metode gabungan pada instance pembangun kueri. Argumen pertama yang diteruskan ke metode gabungan adalah nama tabel yang perlu Anda ikuti, sedangkan argumen yang tersisa menentukan batasan kolom untuk bergabung. Anda bahkan dapat bergabung dengan beberapa tabel dalam satu kueri:
use Foxdb DB ;
$ users = DB :: table ( ' users ' )
-> join ( ' contacts ' , ' users.id ' , ' = ' , ' contacts.user_id ' )
-> join ( ' orders ' , ' users.id ' , ' = ' , ' orders.user_id ' )
-> select ( ' users.* ' , ' contacts.phone ' , ' orders.price ' )
-> get ();Di FoxDB, Anda dapat melakukannya dengan lebih mudah
$ users = DB :: table ( ' users ' )
-> select ( ' users.* ' , ' orders.price ' )
-> join ( ' orders.user_id ' , ' users.id ' )
-> get (); Dalam struktur ini, Anda memasukkan nama tabel yang ingin Anda ikuti dengan kunci asingnya ( 'orders.user_id' ) dan kemudian kunci utama ( 'user.id' ).
Jika Anda ingin melakukan "gabungan kiri" atau "gabungan kanan" alih -alih "gabungan batin", gunakan metode Leftjoin atau Rightjoin. Metode -metode ini memiliki tanda tangan yang sama dengan metode gabungan:
$ users = DB :: table ( ' users ' )
-> leftJoin ( ' posts ' , ' users.id ' , ' = ' , ' posts.user_id ' )
-> get (); $ users = DB :: table ( ' users ' )
-> rightJoin ( ' posts ' , ' users.id ' , ' = ' , ' posts.user_id ' )
-> get ();Anda dapat menggunakan metode CrossJoin untuk melakukan "Cross Joint". Cross Joins menghasilkan produk cartesian antara meja pertama dan meja bergabung:
$ sizes = DB :: table ( ' sizes ' )
-> crossJoin ( ' colors ' )
-> get ();Anda dapat menggunakan metode pembangun kueri di mana untuk menambahkan "di mana" klausa ke kueri. Panggilan paling dasar ke metode WHERE membutuhkan tiga argumen. Argumen pertama adalah nama kolom. Argumen kedua adalah operator, yang dapat berupa operator yang didukung oleh database. Argumen ketiga adalah nilai yang dibandingkan dengan nilai kolom.
Misalnya, kueri berikut mengambil pengguna di mana nilai kolom suara sama dengan 100 dan nilai kolom usia lebih besar dari 35:
$ users = DB :: table ( ' users ' )
-> where ( ' votes ' , ' = ' , 100 )
-> where ( ' age ' , ' > ' , 35 )
-> get ();Untuk kenyamanan, jika Anda ingin memverifikasi bahwa kolom adalah = ke nilai yang diberikan, Anda dapat memberikan nilai sebagai argumen kedua ke metode WHERE. FOXDB akan menganggap Anda ingin menggunakan operator =:
$ users = DB :: table ( ' users ' )-> where ( ' votes ' , 100 )-> get ();Seperti yang disebutkan sebelumnya, Anda dapat menggunakan operator apa pun yang didukung oleh sistem database Anda:
$ users = DB :: table ( ' users ' )
-> where ( ' votes ' , ' >= ' , 100 )
-> get (); $ users = DB :: table ( ' users ' )
-> where ( ' votes ' , ' <> ' , 100 )
-> get (); $ users = DB :: table ( ' users ' )
-> where ( ' name ' , ' like ' , ' T% ' )
-> get ();Saat merantai panggilan ke metode Where Builder di mana, klausa "di mana" akan bergabung bersama menggunakan dan operator. Namun, Anda dapat menggunakan metode atau di mana untuk bergabung dengan klausa ke kueri menggunakan OR Operator. Metode atau di mana menerima argumen yang sama dengan metode WHERE:
$ users = DB :: table ( ' users ' )
-> where ( ' votes ' , ' > ' , 100 )
-> orWhere ( ' name ' , ' John ' )
-> get ();Jika Anda perlu mengelompokkan kondisi "atau" dalam tanda kurung, Anda dapat melewati penutupan sebagai argumen pertama untuk metode atau di mana:
$ users = DB :: table ( ' users ' )
-> where ( ' votes ' , ' > ' , 100 )
-> orWhere ( function ( $ query ) {
$ query -> where ( ' name ' , ' Abigail ' )
-> where ( ' votes ' , ' > ' , 50 );
})
-> get ();Contoh di atas akan menghasilkan SQL berikut:
select * from users where votes > 100 or (name = 'Abigail' and votes > 50)
Metode whereNot dan orWhereNot dapat digunakan untuk meniadakan kelompok kendala kueri tertentu. Misalnya, kueri berikut tidak termasuk produk yang ada di izin atau yang memiliki harga yang kurang dari sepuluh:
$ products = DB :: table ( ' products ' )
-> whereNot ( function ( $ query ) {
$ query -> where ( ' clearance ' , true )
-> orWhere ( ' price ' , ' < ' , 10 );
})
-> get (); Metode whereBetween memverifikasi bahwa nilai kolom adalah antara dua nilai:
$ users = DB :: table ( ' users ' )
-> whereBetween ( ' votes ' , [ 1 , 100 ])
-> get (); Metode whereNotBetween memverifikasi bahwa nilai kolom berada di luar dua nilai:
$ users = DB :: table ( ' users ' )
-> whereNotBetween ( ' votes ' , [ 1 , 100 ])
-> get (); Metode whereIn memverifikasi bahwa nilai kolom yang diberikan terkandung dalam array yang diberikan:
$ users = DB :: table ( ' users ' )
-> whereIn ( ' id ' , [ 1 , 2 , 3 ])
-> get (); Metode whereNotIn memverifikasi bahwa nilai kolom yang diberikan tidak terkandung dalam array yang diberikan:
$ users = DB :: table ( ' users ' )
-> whereNotIn ( ' id ' , [ 1 , 2 , 3 ])
-> get (); Metode whereNull memverifikasi bahwa nilai kolom yang diberikan adalah nol:
$ users = DB :: table ( ' users ' )
-> whereNull ( ' updated_at ' )
-> get (); Metode whereNotNull memverifikasi bahwa nilai kolom tidak nol:
$ users = DB :: table ( ' users ' )
-> whereNotNull ( ' updated_at ' )
-> get (); Metode whereDate dapat digunakan untuk membandingkan nilai kolom dengan tanggal:
$ users = DB :: table ( ' users ' )
-> whereDate ( ' created_at ' , ' 2016-12-31 ' )
-> get (); Metode whereMonth dapat digunakan untuk membandingkan nilai kolom dengan bulan tertentu:
$ users = DB :: table ( ' users ' )
-> whereMonth ( ' created_at ' , ' 12 ' )
-> get (); Metode whereDay dapat digunakan untuk membandingkan nilai kolom dengan hari tertentu dalam sebulan:
$ users = DB :: table ( ' users ' )
-> whereDay ( ' created_at ' , ' 31 ' )
-> get (); Metode whereYear dapat digunakan untuk membandingkan nilai kolom dengan tahun tertentu:
$ users = DB :: table ( ' users ' )
-> whereYear ( ' created_at ' , ' 2016 ' )
-> get (); Metode whereTime dapat digunakan untuk membandingkan nilai kolom dengan waktu tertentu:
$ users = DB :: table ( ' users ' )
-> whereTime ( ' created_at ' , ' = ' , ' 11:20:45 ' )
-> get (); Metode whereColumn dapat digunakan untuk memverifikasi bahwa dua kolom sama:
$ users = DB :: table ( ' users ' )
-> whereColumn ( ' first_name ' , ' last_name ' )
-> get (); Anda juga dapat melewati operator perbandingan ke metode whereColumn :
$ users = DB :: table ( ' users ' )
-> whereColumn ( ' updated_at ' , ' > ' , ' created_at ' )
-> get (); Metode orderBy memungkinkan Anda untuk mengurutkan hasil kueri berdasarkan kolom yang diberikan. Argumen pertama yang diterima dengan metode orderBy harus menjadi kolom yang ingin Anda urutkan, sedangkan argumen kedua menentukan arah dari sortir dan dapat berupa ASC atau desc:
$ users = DB :: table ( ' users ' )
-> orderBy ( ' name ' , ' desc ' )
-> get ();Untuk mengurutkan berdasarkan beberapa kolom, Anda dapat memohon pesanan dengan sebanyak yang diperlukan:
$ users = DB :: table ( ' users ' )
-> orderBy ( ' name ' , ' desc ' )
-> orderBy ( ' email ' , ' asc ' )
-> get (); Metode latest dan oldest memungkinkan Anda untuk memesan hasil dengan mudah berdasarkan tanggal. Secara default, hasilnya akan dipesan oleh kolom created_at tabel. Atau, Anda dapat melewati nama kolom yang ingin Anda urutkan dengan:
$ user = DB :: table ( ' users ' )
-> latest ()
-> first ();Metode inrandomorder dapat digunakan untuk mengurutkan hasil kueri secara acak. Misalnya, Anda dapat menggunakan metode ini untuk mengambil pengguna acak:
$ randomUser = DB :: table ( ' users ' )
-> inRandomOrder ()
-> first ();groupBy & having metode Seperti yang Anda duga, groupBy dan having metode dapat digunakan untuk mengelompokkan hasil kueri. Tanda tangan Metode having mirip dengan metode WHERE:
$ users = DB :: table ( ' users ' )
-> groupBy ( ' account_id ' )
-> having ( ' account_id ' , ' > ' , 100 )
-> get ();Anda dapat meneruskan beberapa argumen ke metode Groupby untuk dikelompokkan dengan beberapa kolom:
$ users = DB :: table ( ' users ' )
-> groupBy ( ' first_name ' , ' status ' )
-> having ( ' account_id ' , ' > ' , 100 )
-> get ();Untuk membangun pernyataan yang lebih maju, lihat metode Havenraw.
Anda dapat menggunakan skip dan take metode untuk membatasi jumlah hasil yang dikembalikan dari kueri atau untuk melewatkan sejumlah hasil dalam kueri:
$ users = DB :: table ( ' users ' )-> skip ( 10 )-> take ( 5 )-> get (); Atau, Anda dapat menggunakan metode limit dan offset . Metode -metode ini secara fungsional setara dengan metode Take and Skip, masing -masing:
$ users = DB :: table ( ' users ' )
-> offset ( 10 )
-> limit ( 5 )
-> get (); Pembuat kueri juga menyediakan metode insert yang dapat digunakan untuk memasukkan catatan ke dalam tabel database. Metode insert menerima array nama dan nilai kolom:
DB :: table ( ' users ' )-> insert ([
' email ' => ' [email protected] ' ,
' votes ' => 0
]); Jika tabel memiliki ID penambah otomatis, gunakan metode insertGetId untuk memasukkan catatan dan kemudian mengambil ID:
$ id = DB :: table ( ' users ' )-> insertGetId (
[ ' email ' => ' [email protected] ' , ' votes ' => 0 ]
);Selain memasukkan catatan ke dalam database, pembangun kueri juga dapat memperbarui catatan yang ada menggunakan metode pembaruan. Metode pembaruan, seperti metode insert, menerima array kolom dan pasangan nilai yang menunjukkan kolom yang akan diperbarui. Metode pembaruan mengembalikan jumlah baris yang terpengaruh. Anda dapat membatasi kueri pembaruan menggunakan di mana klausa:
$ affected = DB :: table ( ' users ' )
-> where ( ' id ' , 1 )
-> update ([ ' votes ' => 1 ]);Pembuat kueri juga menyediakan metode yang nyaman untuk menambah atau mengurangi nilai kolom yang diberikan. Kedua metode ini menerima setidaknya satu argumen: kolom untuk dimodifikasi. Argumen kedua dapat disediakan untuk menentukan jumlah di mana kolom harus bertambah atau dikurangi:
DB :: table ( ' users ' )-> increment ( ' votes ' );
DB :: table ( ' users ' )-> increment ( ' votes ' , 5 );
DB :: table ( ' users ' )-> decrement ( ' votes ' );
DB :: table ( ' users ' )-> decrement ( ' votes ' , 5 ); DB :: table ( ' users ' )-> where ( ' id ' , $ id )-> delete ();Anda dapat menggunakan sintaksis yang lebih menyenangkan, yang selain memperpendek kode, juga membantu membuat kode lebih mudah dibaca
Untuk membuat pertanyaan berdasarkan Boolean, Anda dapat menggunakan metode true dan false is
$ active_list = DB :: table ( ' users ' )-> is ( ' active ' )-> get ();
// OR
$ active_list = DB :: table ( ' users ' )-> true ( ' active ' )-> get (); $ inactive_list = DB :: table ( ' users ' )-> is ( ' active ' , false )-> get ();
//OR
$ inactive_list = DB :: table ( ' users ' )-> false ( ' active ' )-> get ();Anda tidak perlu menggunakan metode WHERE untuk pertanyaan Anda secara berurutan. Anda dapat menggunakan dan metode atau menggunakan atau bukan di mana -mana.
Contoh:
DB :: table ( ' users ' )
-> is ( ' active ' )
-> and ( ' credit ' , ' > ' , 0 )
-> or ( ' vip ' , true )
-> get (); DB :: table ( ' users ' )
-> in ( ' id ' , [ 1 , 5 , 10 ])
-> get ();Metode lain juga tersedia, seperti metode berikut:
not(..) / orNot(..)
in(..) / notIn(..) / orIn(..) / orNotIn(..)
like(..) / or orLike(..)
null(..) / orNull(..) / notNull(..) / orNotNull(..)
date(..) / orDate(..)
year(..) / orYear(..)
month(..) / orMonth(..)
day(..) / orDay(..)
time(..) / orTime(..)