ThinkPHP: モデル用の 3 つの最も強力なツールの 1 つ (検索者)

爱喝马黛茶的安东尼
リリース: 2019-12-16 16:51:50
転載
3189 人が閲覧しました

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(&#39;name&#39;,&#39;like&#39;, $value . &#39;%&#39;);
    }
    
    public function searchCreateTimeAttr($query, $value, $data)
    {
        $query->whereBetweenTime(&#39;create_time&#39;, $value[0], $value[1]);
    }    
}
ログイン後にコピー

サーチャー メソッドには 3 つのパラメーターがあり、最初のパラメーターはクエリ オブジェクト、2 番目は現在の検索識別子の値、3 番目はすべての現在の検索データ (オプション)。

次に、次のクエリを使用できます。

User::withSearch([&#39;name&#39;, &#39;create_time&#39;], [
&#39;name&#39;=>&#39;think&#39;,
    &#39;create_time&#39;=>[&#39;2018-8-1&#39;,&#39;2018-8-5&#39;],
        &#39;status&#39;=>1
    ])
->select();
ログイン後にコピー

最終的に生成される SQL ステートメントは、

SELECT * FROM `think_user` WHERE  `name` LIKE &#39;think%&#39; AND `create_time` BETWEEN &#39;2018-08-01 00:00:00&#39; AND 
&#39;2018-08-05 00:00:00&#39;
ログイン後にコピー

のようになります。ステータス フィールドにデータがないことがわかります。渡されるフォームの不正なクエリ条件を回避するのは非常に良いことです。この例では、name 条件と create_time 条件のみがクエリに使用できます。

実際には、サーチャーでクエリ式を使用するだけでなく、他のクエリ コンストラクターやチェーン操作も使用できます。

たとえば、フォームで定義された並べ替えフィールドによって検索結果を並べ替える必要がある場合は、

<?php
namespace app\index\model;
use think\Model;
class User extends Model 
{
    public function searchNameAttr($query, $value, $data)
    {
        $query->where(&#39;name&#39;,&#39;like&#39;, $value . &#39;%&#39;);
        if (isset($data[&#39;sort&#39;])) {
        $query->order($data[&#39;sort&#39;]);
        }        
    }
    
    public function searchCreateTimeAttr($query, $value, $data)
    {
        $query->whereBetweenTime(&#39;create_time&#39;, $value[0], $value[1]);
    }      
}
ログイン後にコピー

を使用できます。次に、次のクエリ

User::withSearch([&#39;name&#39;,&#39;create_time&#39;, &#39;status&#39;], [
&#39;name&#39;=>&#39;think&#39;,
    &#39;create_time&#39;=>[&#39;2018-8-1&#39;,&#39;2018-8-5&#39;],
        &#39;status&#39;=>1,
        &#39;sort&#39;=>[&#39;status&#39;=>&#39;desc&#39;],
    ])
->select();
ログイン後にコピー
## を使用できます。 #最終クエリ SQL

SELECT * FROM `think_user` WHERE  `name` LIKE &#39;think%&#39; AND `create_time` BETWEEN &#39;2018-08-01 00:00:00&#39; AND 
&#39;2018-08-05 00:00:00&#39; ORDER BY `status` DESC
ログイン後にコピー

のように、検索者のフィールド エイリアスを定義することもできます。

User::withSearch([&#39;name&#39; => &#39;nickname&#39;,&#39;create_time&#39;, &#39;status&#39;], [
&#39;nickname&#39;=>&#39;think&#39;,
    &#39;create_time&#39;=>[&#39;2018-8-1&#39;,&#39;2018-8-5&#39;],
        &#39;status&#39;=>1,
        &#39;sort&#39;=>[&#39;status&#39;=>&#39;desc&#39;],
    ])
->select();
ログイン後にコピー

検索されたデータはニックネーム フィールド識別子を使用しますが、引き続き検索者が識別したものを使用します。 name フィールドによる (つまり、searchNameAttr メソッド)。

サーチャーは通常、クエリ範囲と比較されます。定義されているサーチャーの数に関係なく、呼び出す必要があるのは 1 回だけです。クエリ範囲を結合する必要がある場合は、クエリを複数回呼び出す必要があります。

Db クエリ メソッドを使用している場合でも、検索関数は使用できますが、次のように検索メソッドの定義をクロージャ メソッドに変更する必要があります。

User::withSearch([&#39;name&#39; => function($query,$value,$data){
    $query->where(&#39;name&#39;,&#39;like&#39;, $value . &#39;%&#39;);
}, &#39;create_time&#39;=>function($query,$value,$data){
    $query->whereBetweenTime(&#39;create_time&#39;, $value[0], $value[1]);
}], [
&#39;name&#39;=>&#39;think&#39;,
    &#39;create_time&#39;=>[&#39;2018-8-1&#39;,&#39;2018-8-5&#39;],
        &#39;status&#39;=>1
    ])
->select();
ログイン後にコピー
PHP 中国語 Web サイト、無料の

ThinkPHP 入門チュートリアル がたくさんあり、誰でも学習することができます。

この記事はhttps://blog.thinkphp.cn/783775

から転載されています。

以上がThinkPHP: モデル用の 3 つの最も強力なツールの 1 つ (検索者)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:thinkphp.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!