Maison  >  Article  >  cadre php  >  ThinkPHP : principes de base de la requête de données

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

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼avant
2019-12-16 17:46:263019parcourir

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

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

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

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

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

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

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

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

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

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

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

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

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!

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