Maison > cadre php > PensezPHP > le corps du texte

ThinkPHP : principes de base de la requête de données

爱喝马黛茶的安东尼
Libérer: 2019-12-16 17:46:26
avant
3018 Les gens l'ont consulté

ThinkPHP : principes de base de la requête de données

Veuillez essayer d'incorporer les plusieurs principes de base de l'interrogation de données impliqués dans cet article dans les spécifications de votre projet, ce qui est également la meilleure pratique préconisée par le responsable. Avant cela, j'espère que vous avez lu un blog précédent : "Comprenez-vous vraiment la posture d'utilisation correcte des classes et des modèles Db ?".

Essayez de ne pas utiliser de requêtes conditionnelles sur tableau

La plupart des syntaxes de requête déroutantes sont causées par l'utilisation de requêtes conditionnelles sur tableau, et l'utilisation de requêtes conditionnelles sur tableau dans 5.1 est le même que celui de la 5.0 C'est complètement différent. Si vous êtes habitué à la méthode de requête de tableau de 5.0, je vous suggère de lire cet article : "Apprenez-vous à utiliser la requête d'objet tableau 5.1".

Ce qui suit peut être une erreur de requête que de nombreux novices ont tendance à commettre.

$where['id'] = ['in', '1,2,3'];
User::where($where)->select();
Copier après la connexion

De toute évidence, cette réflexion sur les requêtes est profondément influencée par l'ancienne version. Par rapport à la version 5.0, la syntaxe de requête de la version 5.1 est plus orientée objet. Voici l'utilisation correcte.

$where['id'] = [1,2,3];
User::where($where)->select();
Copier après la connexion

Peut-être parce que les tableaux de PHP sont si faciles à utiliser, de nombreuses personnes apprécient les conditions de requête des tableaux (ou sont-elles anxieuses à propos des objets ?). Mais si vous utilisez correctement le générateur de requêtes et coopérez avec les fonctionnalités associées du modèle, votre logique de requête peut devenir plus claire et plus facile à maintenir.

De plus, dans certaines conditions de requête plus complexes, vous ne pouvez pas utiliser de tableaux pour terminer la requête, comme l'utilisation de requête suivante.

User::where('id', '>', 100)
    ->whereOr(&#39;id&#39;, &#39;<&#39;, 10)
    ->where(&#39;name&#39;, &#39;like&#39;, &#39;think%&#39;)
    ->whereColumn(&#39;name&#39;, &#39;nickname&#39;)
    ->when(&#39;80&#39;== $condition, function ($query) {
        $query->where(&#39;score&#39;, &#39;>&#39;, 80)->limit(10);
    })->select();
Copier après la connexion

Donc, à moins que vous ne connaissiez l'utilisation de la requête de tableau dans la version 5.1, veuillez essayer de ne pas utiliser la requête de condition de tableau.

Utilisez les conditions de requête de chaîne en toute sécurité

Lors de l'utilisation de conditions de requête de chaîne, s'il existe des variables externes, assurez-vous d'utiliser la liaison de paramètres et utilisez de préférence la méthode WhereRaw, qui peut être mélangé avec d'autres méthodes de création de requêtes.

User::whereRaw("id = :id AND name = :name", [
        &#39;id&#39; => [$id, \PDO::PARAM_INT] , 
        &#39;name&#39; => $name
    ])->where(&#39;status&#39;, 1)
    ->order(&#39;id&#39;, &#39;desc&#39;)
    ->select();
Copier après la connexion

Pour certaines requêtes plus soucieuses des performances, vous pouvez également utiliser directement la méthode de requête ou d'exécution, mais vous devez également faire attention à la sécurité des paramètres et considérer les problèmes de transplantation de différentes bases de données.

Db::query("select * from think_user where id=? AND status=?", [8, 1]);
Db::execute("update think_user set name=:name where status=:status", [&#39;name&#39; => &#39;thinkphp&#39;, &#39;status&#39; => 1]);
Copier après la connexion

Utilisez le mécanisme Raw pour les requêtes qui utilisent des fonctions SQL

Si votre requête contient des fonctions SQL, veuillez utiliser la méthode WhereRaw (ou WhereExp), orderRaw ou fieldRaw.

User::whereExp(&#39;nickname&#39;, "= CONCAT(name, &#39;-&#39;, id)")
    ->orderRaw("field(name,&#39;thinkphp&#39;, &#39;kancloud&#39;)")
    ->fieldRaw(&#39;id,SUM(score)&#39;)
    ->select();
Copier après la connexion

Utilisez les fermetures de manière appropriée, mais n'en abusez pas.

Les requêtes de fermeture ont des utilisations spéciales dans les constructeurs de requêtes, mais il n'est pas nécessaire d'en abuser sauf si nécessaire.

Les scénarios d'utilisation typiques des requêtes de fermeture sont les suivants.

Les fermetures sont généralement utilisées dans les requêtes conditionnelles pour représenter un ensemble de requêtes conditionnelles.

User::when($condition, function ($query) {
    // 满足条件后执行
    $query->where(&#39;score&#39;, &#39;>&#39;, 80)->limit(10);
}, function ($query) {
    // 不满足条件执行
    $query->where(&#39;score&#39;, &#39;>&#39;, 60);
})->select();
Copier après la connexion

Les fermetures sont souvent utilisées dans certaines sous-requêtes.

User::whereIn(&#39;id&#39;, function ($query) {
    $query->table(&#39;profile&#39;)
        ->where(&#39;name&#39;, &#39;like&#39;, &#39;think%&#39;)
        ->field(&#39;id&#39;);
})->select();
Copier après la connexion

Générer un ensemble de conditions de requête fermées

User::where(&#39;id&#39;, &#39;>&#39;, 100)
    ->whereOr(function($query) {
        $query->where(&#39;name&#39;, &#39;like&#39;, &#39;think%&#39;)
        ->whereColumn(&#39;name&#39;, &#39;nickname&#39;);
    })->select();
Copier après la connexion

Dans cette utilisation de requête, les conditions de requête dans la fermeture seront ajoutées avec des parenthèses des deux côtés pour devenir une condition de requête fermée.

Dans de nombreuses requêtes de préchargement associées, les fermetures peuvent être utilisées pour filtrer les données associées.

User::with([&#39;profile&#39; => function($query) {
$query->field(&#39;user_id,email,phone&#39;);
}])->select([1,2,3]);
Copier après la connexion

Réutilisez vos conditions de requête autant que possible

Toutes les conditions de requête doivent être définies au même endroit et réutilisées à plusieurs endroits, par exemple en les encapsulant dans des méthodes de modèle, Surtout, n'écrivez pas un tas de conditions de requête complexes directement dans le code de votre contrôleur, sinon une fois l'entreprise ajustée, ce sera un cauchemar pour les codes de recherche du monde de modifier vos conditions de requête.

Vous pouvez voir de nombreuses façons d'encapsuler directement les conditions de requête dans le contrôleur dans le manuel officiel ou dans certains didacticiels, mais ce n'est que pour faciliter l'affichage de l'utilisation et n'est pas conseillé.

Dans certaines conceptions d'architecture d'applications de moyenne et grande taille, le modèle est généralement divisé en couche de données, couche logique et couche de service, et le contrôleur n'appellera que les méthodes de couche de service. La logique de requête est essentiellement encapsulée dans la couche logique, et la couche de données ne fait que diverses définitions du modèle.

Dans les applications simples, le mécanisme Trait de PHP peut également être utilisé pour implémenter le mécanisme de réutilisation de code.

Utilisez la portée de la requête ou le chercheur pour simplifier la requête

Si vous utilisez une requête modèle, essayez d'encapsuler vos conditions de requête dans la portée de la requête ou la méthode de recherche, requête La principale différence entre une plage et un chercheur est que la plage de requêtes est plus appropriée pour définir un ensemble de conditions de requête (plusieurs champs). Si vous souhaitez appeler plusieurs plages de requêtes, vous devez appeler plusieurs fois, tandis que le chercheur est plus approprié pour définir une plage de requêtes. champ (en fait, ce n’est pas absolu), vous n’avez besoin d’appeler la méthode withSearch qu’une seule fois.

Exemples d'utilisation des étendues de requête et des chercheurs.

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    public function scopeVip($query)
    {
        $query->where(&#39;user_type&#39;, &#39;vip&#39;)
            ->where(&#39;status&#39;, 1)
            ->field(&#39;id,name&#39;);
    }
    
    public function searchAgeAttr($query, $age)
    {
        $query->where(&#39;age&#39;,&#39;>&#39;,$age);
    }    
    
    public function searchScoreAttr($query, $score)
    {
        $query->where(&#39;score&#39;,&#39;<=&#39;,$score)->where(&#39;score&#39;, &#39;>&#39; ,0);
    }    
}
Copier après la connexion

Code du contrôleur

<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
class index extends Controller
{
    public function index(Request $request)
    {
        // 查询VIP会员
        User::vip()->select();
        // 查询年龄和分数
        User::withSearch([&#39;age,&#39;score&#39;&#39;], $request->param())->select();
    }
}
Copier après la connexion

Dans le code du contrôleur, nous nous concentrons uniquement sur la logique métier elle-même et n'avons pas besoin de prêter attention aux conditions de requête à l'intérieur de cette logique. Pour des informations plus détaillées sur les chercheurs et les plages de requêtes, veuillez vous référer au manuel officiel.

Le site Web PHP chinois propose un grand nombre de tutoriels d'introduction ThinkPHP gratuits, tout le monde est invité à apprendre !

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

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!