FOXDBクエリビルダーは、PDOパラメーターバインディングを使用して、SQLインジェクション攻撃からアプリケーションを保護します。クエリビンディングとしてクエリビルダーに渡された文字列をクリーニングまたはサニタイズする必要はありません。
composer require webriumfoxdb
構成
選択します
ステートメントを挿入します
ステートメントを更新します
ステートメントを削除します
特別な機能
スキーマ
雄弁
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
]);
'main'ステートメントは、接続構成のデフォルト名です
DBファサードが提供するtableメソッドを使用して、クエリを開始できます。 tableメソッドは、指定されたテーブルのFluentクエリビルダーインスタンスを返し、クエリにさらに制約をチェーンし、最終的にGETメソッドを使用してクエリの結果を取得できるようにします。
use Foxdb DB ;
$ users = DB :: table ( ' users ' )-> get ();
foreach ( $ users as $ user ) {
echo $ user -> name ;
}データベーステーブルから1つの行を取得するだけである場合は、DBファサードのfirst方法を使用できます。このメソッドは、単一のstdclassオブジェクトを返します。
$ user = DB :: table ( ' users ' )-> where ( ' name ' , ' Jack ' )-> first ();
return $ user -> email ;行全体が必要ない場合は、 valueメソッドを使用してレコードから単一の値を抽出できます。この方法は、列の値を直接返します。
$ email = DB :: table ( ' users ' )-> where ( ' name ' , ' John ' )-> value ( ' email ' ); id列値で単一の行を取得するには、 find方法を使用します。
$ user = DB :: table ( ' users ' )-> find ( 3 ); findメソッドとfirstの違いは、 firstメソッドが結果をSTDClassの形で存在する場合に戻すことですが、 findメソッドは、より多くの機能を提供するModelの形式で結果を返します。 (値が存在しない場合、両方の方法がfalseを返します。)
?バージョン3以上から、クエリを使用して検索することができます
$ 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
}pluckメソッドを使用できます。この例では、ユーザータイトルのコレクションを取得します。
use Foxdb DB ;
$ titles = DB :: table ( ' users ' )-> pluck ( ' title ' );
foreach ( $ titles as $ title ) {
echo $ title ;
}結果のコレクションが、プラックメソッドに2番目の引数を提供することにより、キーとして使用する必要があるという列を指定できます。
$ titles = DB :: table ( ' users ' )-> pluck ( ' title ' , ' name ' );
foreach ( $ titles as $ name => $ title ) {
echo $ title ;
}数千のデータベースレコードを使用する必要がある場合は、DBファサードが提供するchunkメソッドの使用を検討してください。この方法は、一度に少量の結果を取得し、各チャンクを処理のために閉鎖に供給します。たとえば、100レコードのチャンクでユーザーテーブル全体を一度に取得しましょう。
use Foxdb DB ;
DB :: table ( ' users ' )-> orderBy ( ' id ' )-> chunk ( 100 , function ( $ users ) {
foreach ( $ users as $ user ) {
//
}
});閉鎖から偽りを返すことによって、さらにチャンクが処理されるのを止めることができます。
DB :: table ( ' users ' )-> orderBy ( ' id ' )-> chunk ( 100 , function ( $ users ) {
// Process the records...
return false ;
}); eachメソッドを使用できます。
use Foxdb DB ;
DB :: table ( ' users ' )-> orderBy ( ' id ' )-> each ( function ( $ user ) {
//
});FOXDBは、ページネーションの簡単な方法を作成しました。以下の例では、結果の数は10のレコードに制限されており、ページ番号を変更することで情報を取得できます。
$ page = 1 ;
$ list = DB :: table ( ' posts ' )
-> is ( ' active ' )
-> paginate ( 10 , $ page );その出力は、次のプロパティを含むstdclassです。
$ 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クエリビルダーは、 count 、 max 、 min 、 avg 、 sumなどの集約値を取得するためのさまざまな方法も提供します。クエリを作成した後、これらのメソッドのいずれかを呼び出すことができます。
use Foxdb DB ;
$ users = DB :: table ( ' users ' )-> count ();
$ price = DB :: table ( ' orders ' )-> max ( ' price ' );もちろん、これらの方法を他の条項と組み合わせて、集約値の計算方法を微調整することができます。
$ price = DB :: table ( ' orders ' )
-> where ( ' finalized ' , 1 )
-> avg ( ' price ' );Countメソッドを使用して、クエリの制約に一致するレコードが存在するかどうかを判断する代わりに、存在しないメソッドを使用できます。
if ( DB :: table ( ' orders ' )-> where ( ' finalized ' , 1 )-> exists ()) {
// ...
}
if ( DB :: table ( ' orders ' )-> where ( ' finalized ' , 1 )-> doesntExist ()) {
// ...
}選択句の指定
データベーステーブルから常にすべての列を選択するとは限りません。 select方法を使用して、クエリのカスタム「選択」節を指定できます。
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 ();しかし、これを行うためのより現代的な方法があります。以下の例のように振る舞うことができます
$ users = DB :: table ( ' users ' )
-> select ( function ( $ query ){
$ query -> field ( ' name ' );
$ query -> field ( ' email ' )-> as ( ' user_email ' );
})
-> get ();任意の文字列をクエリに挿入する必要がある場合があります。生の文字列式を作成するには、 DBファサードによって提供されるraw方法を使用できます。
$ users = DB :: table ( ' users ' )
-> select ( DB :: raw ( ' count(*) as user_count, status ' ))
-> where ( ' status ' , ' <> ' , 1 )
-> groupBy ( ' status ' )
-> get ();以下の例のようにRAWでパラメーターを使用するには
DB::raw('count(?)',['id'])
ショ和 生のステートメントは文字列としてクエリに注入されるため、SQLインジェクションの脆弱性の作成を避けるように非常に注意する必要があります。
しかし、この目的のために、 SQL injection攻撃を避けるために、次の方法を使用する方が良いです
$ users = DB :: table ( ' users ' )
-> select ( function ( $ query ){
$ query -> count ( ' * ' )-> as ( ' user_count ' )
$ query -> field ( ' status ' );
})
-> get ();この構造では、メソッドas 、 field 、 count 、 sum 、 avg 、 min 、 max 、 allにアクセスできます。
db :: rawメソッドを使用する代わりに、次の方法を使用して、クエリのさまざまな部分に生の式を挿入することもできます。 FOXDBは、生式を使用したクエリがSQL注入の脆弱性に対して保護されていることを保証できないことを忘れないでください。
WhererawおよびOrwhererawメソッドを使用して、生の「Where」節をクエリに注入できます。これらの方法は、2番目の引数として、オプションのバインディングの配列を受け入れます。
$ orders = DB :: table ( ' orders ' )
-> whereRaw ( ' price > IF(state = "TX", ?, 100) ' , [ 200 ])
-> get ();HaveRawおよびOrhavingRawのメソッドは、「having」句の値として生の文字列を提供するために使用できます。これらの方法は、2番目の引数として、オプションのバインディングの配列を受け入れます。
$ orders = DB :: table ( ' orders ' )
-> select ( ' department ' , DB :: raw ( ' SUM(price) as total_sales ' ))
-> groupBy ( ' department ' )
-> havingRaw ( ' SUM(price) > ? ' , [ 2500 ])
-> get ();クエリビルダーは、クエリに結合句を追加するためにも使用できます。基本的な「内部結合」を実行するには、クエリビルダーインスタンスで結合メソッドを使用できます。結合メソッドに渡された最初の引数は、参加する必要があるテーブルの名前であり、残りの引数は結合の列の制約を指定します。単一のクエリで複数のテーブルに参加することもできます。
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 ();FOXDBでは、より簡単に行うことができます
$ users = DB :: table ( ' users ' )
-> select ( ' users.* ' , ' orders.price ' )
-> join ( ' orders.user_id ' , ' users.id ' )
-> get ();この構造では、外部キー( 'orders.user_id' )に参加するテーブルの名前を入力し、次にプライマリキー( 'user.id' )を入力します。
「内側の結合」の代わりに「左結合」または「右の結合」を実行したい場合は、左ヨインまたは右ジョインメソッドを使用します。これらのメソッドは、結合メソッドと同じ署名を持っています。
$ users = DB :: table ( ' users ' )
-> leftJoin ( ' posts ' , ' users.id ' , ' = ' , ' posts.user_id ' )
-> get (); $ users = DB :: table ( ' users ' )
-> rightJoin ( ' posts ' , ' users.id ' , ' = ' , ' posts.user_id ' )
-> get ();CrossJoinメソッドを使用して、「Cross Join」を実行できます。 Cross結合最初のテーブルと結合されたテーブルとの間にデカルト製品を生成します。
$ sizes = DB :: table ( ' sizes ' )
-> crossJoin ( ' colors ' )
-> get ();クエリビルダーのWhere Methodを使用して、「Where」条項をクエリに追加できます。方法への最も基本的な呼び出しには、3つの引数が必要です。最初の引数は列の名前です。 2番目の引数はオペレーターであり、これはデータベースのサポートされているオペレーターのいずれかになります。 3番目の引数は、列の値と比較する値です。
たとえば、次のクエリは、投票列の値が100に等しく、年齢列の値が35を超える場合にユーザーを取得します。
$ users = DB :: table ( ' users ' )
-> where ( ' votes ' , ' = ' , 100 )
-> where ( ' age ' , ' > ' , 35 )
-> get ();便利な場合、列が指定された値に= =であることを確認する場合は、値をWhere Methodの2番目の引数として渡すことができます。 FOXDBは、= operatorを使用したいと仮定します。
$ users = DB :: table ( ' users ' )-> where ( ' votes ' , 100 )-> get ();前述のように、データベースシステムでサポートされているオペレーターを使用できます。
$ 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 ();連鎖すると、クエリビルダーのWhere Methodに呼び出されると、「Where」条項はAnd Operatorを使用して結合されます。ただし、Or Where Where Where Whery Methodを使用して、ORオペレーターを使用してクエリに句を結合できます。またはどこかで、ここの方法と同じ引数を受け入れます。
$ users = DB :: table ( ' users ' )
-> where ( ' votes ' , ' > ' , 100 )
-> orWhere ( ' name ' , ' John ' )
-> get ();括弧内に「または」条件をグループ化する必要がある場合は、最初の引数として閉鎖を渡すことができます。
$ users = DB :: table ( ' users ' )
-> where ( ' votes ' , ' > ' , 100 )
-> orWhere ( function ( $ query ) {
$ query -> where ( ' name ' , ' Abigail ' )
-> where ( ' votes ' , ' > ' , 50 );
})
-> get ();上記の例では、次のSQLが生成されます。
select * from users where votes > 100 or (name = 'Abigail' and votes > 50)
whereNotおよびorWhereNotメソッドを使用して、特定のクエリ制約のグループを無効にすることができます。たとえば、次のクエリでは、クリアランスにある、または10未満の価格を持つ製品は除外されます。
$ products = DB :: table ( ' products ' )
-> whereNot ( function ( $ query ) {
$ query -> where ( ' clearance ' , true )
-> orWhere ( ' price ' , ' < ' , 10 );
})
-> get (); whereBetween 、列の値が2つの値の間にあることを確認します。
$ users = DB :: table ( ' users ' )
-> whereBetween ( ' votes ' , [ 1 , 100 ])
-> get (); whereNotBetweenメソッドは、列の値が2つの値の外側にあることを確認します。
$ users = DB :: table ( ' users ' )
-> whereNotBetween ( ' votes ' , [ 1 , 100 ])
-> get (); whereInは、指定された列の値が指定された配列内に含まれることを確認します。
$ users = DB :: table ( ' users ' )
-> whereIn ( ' id ' , [ 1 , 2 , 3 ])
-> get (); whereNotInメソッドは、指定された列の値が指定された配列に含まれていないことを確認します。
$ users = DB :: table ( ' users ' )
-> whereNotIn ( ' id ' , [ 1 , 2 , 3 ])
-> get (); whereNullメソッドは、指定された列の値がnullであることを確認します。
$ users = DB :: table ( ' users ' )
-> whereNull ( ' updated_at ' )
-> get (); whereNotNullメソッドは、列の値がnullではないことを確認します。
$ users = DB :: table ( ' users ' )
-> whereNotNull ( ' updated_at ' )
-> get (); whereDateメソッドは、日付と列の値を比較するために使用できます。
$ users = DB :: table ( ' users ' )
-> whereDate ( ' created_at ' , ' 2016-12-31 ' )
-> get (); whereMonthメソッドは、特定の月と列の値を比較するために使用できます。
$ users = DB :: table ( ' users ' )
-> whereMonth ( ' created_at ' , ' 12 ' )
-> get (); whereDayメソッドは、月の特定の日と列の値を比較するために使用できます。
$ users = DB :: table ( ' users ' )
-> whereDay ( ' created_at ' , ' 31 ' )
-> get (); columnの値を特定の年と比較するために、 whereYearメソッドを使用できます。
$ users = DB :: table ( ' users ' )
-> whereYear ( ' created_at ' , ' 2016 ' )
-> get (); whereTimeメソッドは、特定の時間と列の値を比較するために使用できます。
$ users = DB :: table ( ' users ' )
-> whereTime ( ' created_at ' , ' = ' , ' 11:20:45 ' )
-> get (); whereColumnメソッドを使用して、2つの列が等しいことを確認できます。
$ users = DB :: table ( ' users ' )
-> whereColumn ( ' first_name ' , ' last_name ' )
-> get ();また、比較演算子をwhereColumnメソッドに渡すこともできます。
$ users = DB :: table ( ' users ' )
-> whereColumn ( ' updated_at ' , ' > ' , ' created_at ' )
-> get ();orderByメソッドを使用すると、特定の列でクエリの結果を並べ替えることができます。 orderByメソッドで受け入れられた最初の引数は、あなたが並べ替えたい列である必要がありますが、2番目の引数はソートの方向を決定し、ASCまたはDESCのいずれかである可能性があります。
$ users = DB :: table ( ' users ' )
-> orderBy ( ' name ' , ' desc ' )
-> get ();複数の列で並べ替えるには、必要に応じて数回Orderbyを呼び出すことができます。
$ users = DB :: table ( ' users ' )
-> orderBy ( ' name ' , ' desc ' )
-> orderBy ( ' email ' , ' asc ' )
-> get ();latestかつoldest方法では、日付ごとに結果を簡単に注文できます。デフォルトでは、結果はテーブルのcreated_at列によって注文されます。または、並べ替えたい列名を渡すことができます。
$ user = DB :: table ( ' users ' )
-> latest ()
-> first ();インランダムオーダーメソッドを使用して、クエリの結果をランダムにソートすることができます。たとえば、この方法を使用してランダムユーザーを取得できます。
$ randomUser = DB :: table ( ' users ' )
-> inRandomOrder ()
-> first ();groupByとメソッドhavingご想像のとおり、クエリの結果をグループ化するために、 groupByとhavingを使用することができます。 having Methodの署名は、Where Methodの署名に似ています。
$ users = DB :: table ( ' users ' )
-> groupBy ( ' account_id ' )
-> having ( ' account_id ' , ' > ' , 100 )
-> get ();複数の引数をGroupbyメソッドに渡して、複数の列でグループ化することができます。
$ users = DB :: table ( ' users ' )
-> groupBy ( ' first_name ' , ' status ' )
-> having ( ' account_id ' , ' > ' , 100 )
-> get ();より高度なステートメントを構築するには、haveRawメソッドを参照してください。
skipを使用してメソッドtake使用して、クエリから返される結果の数を制限するか、クエリで特定の数の結果をスキップすることができます。
$ users = DB :: table ( ' users ' )-> skip ( 10 )-> take ( 5 )-> get ();または、 limitおよびoffsetメソッドを使用することもできます。これらの方法は、それぞれテイクとスキップの方法と機能的に同等です。
$ users = DB :: table ( ' users ' )
-> offset ( 10 )
-> limit ( 5 )
-> get ();クエリビルダーは、データベーステーブルにレコードを挿入するために使用できるinsert方法も提供します。挿入方法は、列名と値の配列を受け入れます。
DB :: table ( ' users ' )-> insert ([
' email ' => ' [email protected] ' ,
' votes ' => 0
]);テーブルに自動インクリメントIDがある場合は、 insertGetIdメソッドを使用してレコードを挿入し、IDを取得します。
$ id = DB :: table ( ' users ' )-> insertGetId (
[ ' email ' => ' [email protected] ' , ' votes ' => 0 ]
);データベースにレコードを挿入することに加えて、クエリビルダーは更新方法を使用して既存のレコードを更新することもできます。更新方法は、挿入方法と同様に、更新する列を示す列と値のペアの配列を受け入れます。更新方法は、影響を受ける行の数を返します。条項を使用して更新クエリを制約することができます。
$ affected = DB :: table ( ' users ' )
-> where ( ' id ' , 1 )
-> update ([ ' votes ' => 1 ]);クエリビルダーは、特定の列の値を増加または減少させるための便利な方法も提供します。これらの方法は両方とも、少なくとも1つの引数を受け入れます。変更する列です。 2番目の引数を提供して、列を増分または減少させる量を指定することができます。
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 ();コードの短縮に加えて、コードをより読みやすくするのに役立つより楽しい構文を使用できます。
Booleanに基づいてクエリを作成するには、 true and 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 ();クエリに連続してwhereメソッドを使用する必要はありません。使用するか、使用するか、またはその代わりに使用できます。
例:
DB :: table ( ' users ' )
-> is ( ' active ' )
-> and ( ' credit ' , ' > ' , 0 )
-> or ( ' vip ' , true )
-> get (); DB :: table ( ' users ' )
-> in ( ' id ' , [ 1 , 5 , 10 ])
-> get ();次の方法など、他の方法も利用できます。
not(..) / orNot(..)
in(..) / notIn(..) / orIn(..) / orNotIn(..)
like(..) / orLike(..)
null(..) / orNull(..) / notNull(..) / orNotNull(..)
date(..) / orDate(..)
year(..) / orYear(..)
month(..) / orMonth(..)
day(..) / orDay(..)
time(..) / orTime(..)