ホームページ > 記事 > PHPフレームワーク > ThinkPHP: モデル用の 3 つの最も強力なツールの 1 つ (検索者)
[√新スキル] サーチャー - 検索コードの統合管理
モデル サーチャーは、自動モデル ゲッター関数とモディファイア関数に続く 3 番目の統合管理ツールは、主にフィールド (または検索識別子) のクエリ条件式をカプセル化するために使用されます。サーチャーは特別なメソッドに対応します (メソッドはパブリック タイプである必要があります)。メソッド名の仕様は次のとおりです。 searchFieldNameAttr (FieldName は、データ テーブル フィールドのキャメル ケース変換です) サーチャーは、withSearch メソッドが呼び出された場合にのみトリガーされます。
検索者の使用シナリオは次のとおりです。
·フォームの検索条件の制限と標準化;
·事前定義されたクエリ条件により、クエリが簡素化されます。
たとえば、User モデルの name フィールドと time フィールドにサーチャーを定義する必要がある場合、次を使用できます。
<?php namespace app\index\model; use think\Model; class User extends Model { public function searchNameAttr($query, $value, $data) { $query->where('name','like', $value . '%'); } public function searchCreateTimeAttr($query, $value, $data) { $query->whereBetweenTime('create_time', $value[0], $value[1]); } }
サーチャー メソッドには 3 つのパラメーターがあり、最初のパラメーターはクエリ オブジェクト、2 番目は現在の検索識別子の値、3 番目はすべての現在の検索データ (オプション)。
次に、次のクエリを使用できます。
User::withSearch(['name', 'create_time'], [ 'name'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1 ]) ->select();
最終的に生成される SQL ステートメントは、
SELECT * FROM `think_user` WHERE `name` LIKE 'think%' AND `create_time` BETWEEN '2018-08-01 00:00:00' AND '2018-08-05 00:00:00'
のようになります。ステータス フィールドにデータがないことがわかります。渡されるフォームの不正なクエリ条件を回避するのは非常に良いことです。この例では、name 条件と create_time 条件のみがクエリに使用できます。
実際には、サーチャーでクエリ式を使用するだけでなく、他のクエリ コンストラクターやチェーン操作も使用できます。
たとえば、フォームで定義された並べ替えフィールドによって検索結果を並べ替える必要がある場合は、
<?php namespace app\index\model; use think\Model; class User extends Model { public function searchNameAttr($query, $value, $data) { $query->where('name','like', $value . '%'); if (isset($data['sort'])) { $query->order($data['sort']); } } public function searchCreateTimeAttr($query, $value, $data) { $query->whereBetweenTime('create_time', $value[0], $value[1]); } }
を使用できます。次に、次のクエリ
User::withSearch(['name','create_time', 'status'], [ 'name'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1, 'sort'=>['status'=>'desc'], ]) ->select();## を使用できます。 #最終クエリ SQL
SELECT * FROM `think_user` WHERE `name` LIKE 'think%' AND `create_time` BETWEEN '2018-08-01 00:00:00' AND '2018-08-05 00:00:00' ORDER BY `status` DESCのように、検索者のフィールド エイリアスを定義することもできます。
User::withSearch(['name' => 'nickname','create_time', 'status'], [ 'nickname'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1, 'sort'=>['status'=>'desc'], ]) ->select();検索されたデータはニックネーム フィールド識別子を使用しますが、引き続き検索者が識別したものを使用します。 name フィールドによる (つまり、searchNameAttr メソッド)。 サーチャーは通常、クエリ範囲と比較されます。定義されているサーチャーの数に関係なく、呼び出す必要があるのは 1 回だけです。クエリ範囲を結合する必要がある場合は、クエリを複数回呼び出す必要があります。 Db クエリ メソッドを使用している場合でも、検索関数は使用できますが、次のように検索メソッドの定義をクロージャ メソッドに変更する必要があります。
User::withSearch(['name' => function($query,$value,$data){ $query->where('name','like', $value . '%'); }, 'create_time'=>function($query,$value,$data){ $query->whereBetweenTime('create_time', $value[0], $value[1]); }], [ 'name'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1 ]) ->select();PHP 中国語 Web サイト、無料の
ThinkPHP 入門チュートリアル がたくさんあり、誰でも学習することができます。
この記事はhttps://blog.thinkphp.cn/783775から転載されています。
以上がThinkPHP: モデル用の 3 つの最も強力なツールの 1 つ (検索者)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。