Maison > cadre php > PensezPHP > le corps du texte

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

爱喝马黛茶的安东尼
Libérer: 2019-12-16 16:51:50
avant
3209 Les gens l'ont consulté

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]);
    }    
}
Copier après la connexion

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();
Copier après la connexion

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;
Copier après la connexion

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]);
    }      
}
Copier après la connexion

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();
Copier après la connexion

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
Copier après la connexion

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();
Copier après la connexion

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();
Copier après la connexion

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!

Étiquettes associées:
source:thinkphp.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal