Maison >cadre php >PensezPHP >ThinkPHP : un des trois outils de modélisation les plus puissants (chercheur)

ThinkPHP : un des trois outils de modélisation les plus puissants (chercheur)

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼avant
2019-12-16 16:51:503251parcourir

ThinkPHP : un des trois outils de modélisation les plus puissants (chercheur)

[√Nouvelle compétence] Chercheur - gestion unifiée de votre code de recherche

Le chercheur de modèles est un automatique Le Le troisième outil de gestion unifié après les fonctions getter et modificateur de modèle est principalement utilisé pour encapsuler les expressions de conditions de requête des champs (ou identifiants de recherche). Un chercheur correspond à une méthode spéciale (la méthode doit être de type public). searchFieldNameAttr (FieldName est la conversion en casse chameau du champ de la table de données). Le chercheur n'est déclenché que lorsque la méthode withSearch est appelée.

Les scénarios d'utilisation du chercheur incluent :

·Restreindre et standardiser les conditions de recherche du formulaire

·Les conditions de requête prédéfinies simplifient la requête.

Par exemple, si nous devons définir un chercheur pour le champ nom et le champ heure pour le modèle Utilisateur, nous pouvons utiliser :

<?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]);
    }    
}

La méthode de recherche a trois paramètres, le premier est le objet de requête, le deuxième Le premier est la valeur de l'identifiant de recherche actuel et le troisième est toutes les données de recherche actuelles (facultatif).

Ensuite, nous pouvons utiliser la requête suivante

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();

L'instruction SQL finale générée est similaire à

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;

Vous pouvez voir qu'il n'y a aucune donnée dans le champ d'état du conditions de requête, afin qu'il puisse Il est très bon d'éviter les conditions de requête illégales du formulaire transmis. Dans cet exemple, seules les conditions name et create_time peuvent être utilisées pour la requête.

En fait, en plus d'utiliser des expressions de requête dans le moteur de recherche, vous pouvez également utiliser tout autre constructeur de requêtes et opérations en chaîne.

Par exemple, si vous devez trier les résultats de la recherche selon le champ de tri défini par le formulaire, vous pouvez utiliser

<?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]);
    }      
}

Ensuite, nous pouvons utiliser la requête suivante

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();

Le SQL de la requête finale Cela peut être

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

Vous pouvez également définir un alias de champ pour le chercheur, par exemple :

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();

Les données recherchées utilisent l'identifiant du champ pseudo, mais nous avons quand même utilisez le chercheur identifié par le champ de nom (c'est-à-dire la méthode searchNameAttr).

Le chercheur est généralement comparé à la plage de requêtes. Quel que soit le nombre de chercheurs définis, il ne doit être appelé qu'une seule fois. Si la plage de requêtes doit être combinée, elle devra être appelée plusieurs fois.

Si vous utilisez la méthode de requête Db, vous pouvez toujours utiliser la fonction de recherche, mais la définition de la méthode de recherche doit être remplacée par une méthode de fermeture, comme suit :

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();

Site Web chinois PHP , il existe de nombreux

tutoriels d'introduction à ThinkPHP gratuits, tout le monde est invité à apprendre !

Cet article est reproduit à partir de : https://blog.thinkphp.cn/783775

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer