Maison  >  Article  >  cadre php  >  La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

咔咔
咔咔original
2021-01-11 12:15:312041parcourir

1. La bibliothèque de classes Db combine intelligemment l'utilisation de connecteurs, de requêtes et de générateurs SQL

Dans le répertoire ci-dessus, Kaka utilise la requête comme cas. démonstration , cette utilisation est déconseillée dans le framework, car elle sera difficile à maintenir.

Le cas de cette section sera interrogé à l'aide de la méthode de requête de base de données couramment utilisée par le framework.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Code de cas d'utilisation

Comme vous pouvez le voir dans l'image ci-dessus, les méthodes de requête les plus couramment utilisées sont utilisées ensuite. nous procéderons à une analyse détaillée de cet ensemble de cas.

Le même code viendra à la méthode __callStatic de la classe Db. Cette méthode est exécutée lors de l'appel d'une méthode statique non déclarée.

Cette méthode est différente de la méthode __call. La méthode __call appelle une méthode qui n'existe pas. Assurez-vous de faire attention à la différence entre les deux.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

L'appel d'une méthode statique non déclarée appellera

Pour la méthode dans l'image ci-dessus, l'exécution static::connect() renverra finalement l'objet object(thinkdbQuery) Quant à l'exécution de l'objet. processus interne, veuillez vous référer au deuxième Le contenu du répertoire.

Le flux d'exécution viendra donc à la méthode thinkphp/library/think/db/Query.php de cette classe. Le paramètre table

est le nom de la table de base de données

transmis dans la table. tp_test

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Spécifiez la table de données de l'opération en cours

Selon le code fourni dans la figure ci-dessus, le nom de la table transmis sera jugé trois fois.

  • La première fois pour juger si c'est une chaîne
  • La deuxième fois pour juger si elle existe)
  • Le troisième jugement est de savoir s'il existe.

Selon la chaîne transmise, les trois jugements ci-dessus ne sont pas établis, le processus suivant sera donc exécuté.

Dans la méthode table, vous pouvez voir que le processus d'exécution final consiste à stocker le nom de la table transmis dans l'attribut options.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Enfin, exécutez le processus

et retournez enfin l'objet thinkdbQuery Object.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Retourner l'objet de requête

où l'analyse de la méthode

l'analyse de la méthode de table est terminée La méthode Where sera exécutée immédiatement, également en classe thinkphp/library/think/db/Query.php

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Spécifiez les conditions de requête AND

Dans la figure ci-dessus, vous pouvez voir une méthode func_get_args dans cette classe. Cette méthode renverra un tableau contenant la liste des paramètres de la fonction.

Cette méthode est généralement utilisée avec call_user_func_array Kaka a également utilisé ces deux méthodes pour mener une expérience de cas auparavant.

utilisera alors la fonction array_shift pour supprimer le premier élément (rouge) du tableau et renvoyer la valeur de l'élément supprimé.

Le premier résultat dans l'image ci-dessous est les données obtenues par la méthode func_get_args, et le deuxième ensemble de résultats est le résultat renvoyé par la méthode array_shift.

Les valeurs renvoyées par les deux ensembles de résultats peuvent être comparées pour mieux comprendre les scénarios d'utilisation de array_shift.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Comparaison des deux résultats renvoyés

Ensuite, l'expression de requête sera analysée, ce qui se fait par la méthode parseWhereExp matière .

Une chose à noter dans cette méthode est les deux paramètres transmis.

Le premier paramètre est la logique de requête et le paramètre deux est le paramètre transmis lors de l'utilisation du cas.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Analyse des expressions de requête

Dans la première ligne du code, il y a un point de connaissance que nous devons apprendreinstanceof.

instanceofVous pouvez déterminer si un objet est une instance d'une certaine classe et si un objet implémente une certaine interface.

Le cas d'utilisation de ceci est expliqué en détail dans l'article ThinkPHP源码解析之控制器.

Selon le rôle de l'apprentissage instanceof, on comprend clairement que le premier jugement ne sera pas exécuté.

Continuez à étudier le processus d'exécution suivant, et effectuez une analyse simple du code selon les cases encerclées par Kaka.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Continuez à étudier la seconde moitié

Selon l'image ci-dessus, d'abord, tous les symboles de la logique de requête seront convertis en minuscules

puis jugés$field instanceof Wherepassed Indique si le paramètre est une instance de la classe Where.

Le jugement dernier est $field instanceof ExpressionIl a la même fonction que l'étape précédente.

La logique d'exécution finale du code est donc la partie encerclée dans l'image ci-dessous.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Requête par lots d'analyse de tableau

N'oubliez pas que le paramètre passé à l'endroit où pendant le cas est un tableau.

Si vous modifiez le paramètre en where('t_id',1), le processus de is_string($field) sera suivi. Ce processus sera laissé à tout le monde, et Kaka ne l'analysera pas.

Ici, Kaka utilise toujours des tableaux comme paramètres pour l'analyse, alors le code exécutera toujours la parseArrayWhereItemsméthode de cette classe

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

lot de tableaux Pour interroger

, dans cette méthode, vous devez d'abord savoir ce que key renverra et renvoyer le nom de la clé de l'élément à partir de la position actuelle du pointeur interne.

Donc, le code exécutera le jugement de l'instruction if Selon tous les jugements ci-dessus, il n'est pas cohérent, donc ce code sera exécuté $where[] = [$key, is_array($val) ? 'IN' : '=', $val];

.

Ce code déterminera si la valeur du tableau de boucle est un tableau. S'il s'agit d'un tableau, il est dedans, sinon c'est = Puisque la valeur est 1, la deuxième valeur du tableau est =.

Ensuite, la valeur finale de l'endroit où sont les données imprimées dans la figure ci-dessous.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

La valeur renvoyée dans Where

Puisque Where n'est pas vide, le processus d'exécution de code sera exécuté à la position indiquée ci-dessous , et enfin Renvoie une instance de cette classe.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Stocker les paramètres de requête dans l'attribut d'option

processus d'exécution find()

Ensuite, le code exécutera toujours la méthode find de cette classe pour rechercher un seul enregistrement.

Comme aucun paramètre n'est passé dans find, le code sera exécuté jusqu'à l'$this->parseOptions(); expression d'analyse (peut être utilisée pour des opérations de requête ou d'écriture)

En ce qui concerne le cas actuel, ce paragraphe On dirait que vous pouvez comprendre le code très long si vous le regardez bien. En fin de compte, tous les paramètres actuels sont toujours renvoyés.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Trouver un seul enregistrement

Voici les résultats renvoyés

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Renvoyer tous les résultats des paramètres

Les vraies données de requête sont ce code $result = $this->connection->find($this);, ce code sera exécuté dans le fichier thinkphp/library/think/db/Connection.php

À partir de ce code, vous pouvez voir que lors de l'interrogation d'une donnée, le framework ajoute une limite de 1 par défaut. Quant à la raison pour laquelle elle est ajoutée ainsi, vous devez vérifier la connaissance de l'optimisation SQL.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Trouver un seul enregistrement

Il s'agit ici de la génération d'instructions SQL Vous comprendrez si vous regardez le code. soigneusement, cliquez sur Ce qui est analysé n'est qu'une brève compréhension du processus d'exécution et du code spécifique.

En ce qui concerne le processus de mise en œuvre spécifique, s'il y a une chance, Kaka procédera à une analyse approfondie de chaque méthode séparément dans une étape ultérieure, à ce moment-là, elle se concentrera principalement sur l'analyse du code. .

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Générer des instructions SQL selon certaines règles et requêtes

Le résultat final de retour est le suivant

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Résultats de retour

Ce qui précède concerne la fonction de requête de base de données implémentée par Db en combinaison avec des connecteurs, des requêteurs et des générateurs.

Jusqu'à présent, l'analyse de la scène Db est terminée. Ensuite, Kaka procédera à une analyse simple du modèle.

2. À propos du processus d'implémentation de getLastSql

C'est toujours le cas précédent, utilisons cette méthode pour imprimer le résultat pour voir ce que cela donne est.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Imprimer le cas

Quand vous verrez l'image ci-dessus, vous saurez qu'il s'agit de l'instruction SQL finalement générée par le framework , puis cliquez sur Je vous emmènerai discuter de la manière dont cette instruction SQL est générée.

La photo ci-dessous est le cas de cette manifestation, qui est le lieu encerclé dans la photo ci-dessous.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Cas de démonstration

Le traçage du code à partir de la zone encerclée dans l'image ci-dessus mènera au fichier thinkphp/library/think/Db.php, et cette classe sera méthode __callStatic exécutée, cette méthode ne sera pas expliquée, elle a été mentionnée à plusieurs reprises ci-dessus et auparavant.

Et il n'est pas nécessaire de déclarer le résultat du retour Comme mentionné ci-dessus, il vous suffit de savoir que le résultat final du retour est 返回 object(thinkdbQuery)

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

.
Lorsqu'une méthode statique non déclarée est appelée, elle sera exécutée

Selon le résultat renvoyé dans la figure ci-dessus, nous pouvons savoir qu'elle finira par appeler la object(thinkdbQuery)méthode de cette classe getLastSql

Selon cette méthode, vous pouvez savoir que l'instruction sql de la dernière requête est obtenue.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Obtenez l'instruction SQL de la dernière requête

Il y aura ici des doutes sur ce qu'est l'attribut connection. Voici une analyse simple.

La déclaration de cet attribut est généralement déclarée dans le constructeur de cette classe ou dans le constructeur de la classe parent. C'est aussi une petite astuce lors de la lecture du code source.

Nous devons donc d’abord jeter un œil au constructeur de cette classe.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Fonction d'architecture

Comme vous pouvez le voir sur la figure ci-dessus, l'injection de dépendances est utilisée ici, donc Connection est un objet et est également ce qu'on appelle un connecteur dans le framework .

Cet Connection objet est donc imprimé comme indiqué ci-dessous.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Résultat de l'impression de l'objet connecteur

D'après l'image ci-dessus, nous savons que le fichier de classe utilisé doit être thinkdbconnectorMysql alors il exécutera la méthode getLastSql dans cette classe.

Mais lorsque vous exécuterez cette classe, vous constaterez qu'il n'existe aucune méthode de ce type dans cette classe.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Relation d'héritage

D'après la relation d'héritage dans la figure ci-dessus, nous savons que cette méthode se trouve dans le fichier de classe thinkphp/library/think/db/Connection.php.

L'image ci-dessous montre le processus d'exécution de cette méthode. Vous pouvez voir qu'il y a deux paramètres, mais je suis toujours confus et je ne sais pas ce que c'est.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Obtenir l'instruction SQL de la dernière requête

Selon le suivi du code, nous analysons d'abord brièvement les deux paramètres qui apparaissent dans l'image ci-dessus. Description de

  • $this->queryStrCommande SQL actuelle
  • $this->bindParamètres de liaison

Tracking$ Le la valeur de l'attribut de this->queryStr est

Je suis probablement un peu confus quand j'en arrive à ce point ! Je suis un peu incertain sur cette valeur et le résultat ne peut pas être obtenu par impression.

Bien sûr, une autre méthode consiste à déboguer pour le débogage des points d'arrêt.

Mais puisque Kaka montre à tout le monde le code source ! Vous n'utiliserez pas les deux méthodes ci-dessus, vous trouverez des indices directement à partir du code source.

Selon le cas fourni par Kaka, la dernière étape d'exécution est la méthode find. Cette méthode est également dans la classe thinkphp/library/think/db/Connection.php pour rechercher un seul enregistrement.

Ensuite nous allons chercher un peu dans cette méthode. Le kaka a été encerclé ici pour tout le monde, qui est l'endroit encerclé par kaka sur la photo ci-dessous.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Exécuter la requête

Selon les commentaires de code donnés par Kaka dans l'image ci-dessus, le premier paramètre est l'instruction SQL générée , pour continuer à suivre cette méthode et jeter un œil. Pour le moment, cette méthode implémentera toujours la méthode thinkphp/library/think/db/Connection.php dans le fichier query de cette classe.

Dans cette méthode, vous pouvez voir d'un coup d'œil que le paramétrage de cet queryStr attribut est d'attribuer directement une valeur à cet attribut, ce qui signifie que la valeur de cet attribut est l'instruction SQL générée par le instruction SQL précédente.

La bibliothèque de classes Db de ThinkPHP est utilisée conjointement avec des connecteurs, des requêtes et des générateurs SQL.

Exécutez la requête et renvoyez l'ensemble de données

Donc, ceci getLastSql obtient l'instruction SQL exécutée avant cette instruction et ne peut obtenir que l'instruction SQL exécutée la plus récemment.

Ce qui précède concerne le principe de mise en œuvre de getLastSql Ce qu'il faut noter ici, c'est la génération de SQL, qui est un peu compliquée.

Résumé

Voilà pour l'analyse des scénarios de fonctionnement de la classe Db dans la base de données et la combinaison des connecteurs, des requêteurs et générateurs Cela se termine ici.

Ici, Kaka utilise principalement deux cas d'exécution, le premier est le cas natif et le second est le cas encapsulé dans une trame.

Ces deux cas ont été utilisés pour effectuer une analyse approfondie du code source, mais il existe de nombreuses méthodes d'implémentation dans le document. Pour les autres méthodes, il suffit de suivre les conseils donnés par Kaka puis de l'analyser. petit à petit.

Il n'est pas nécessaire d'exécuter toutes les méthodes. Quelle que soit la méthode utilisée, c'est la méthode analysée ci-dessus, qui est également très simple.

Enfin, j'ai montré comment utiliser getLastSql pour obtenir la dernière requête d'instruction SQL exécutée ici. Le principal principe d'implémentation ici est que lorsque la classe Db exploite la base de données, qu'elle utilise la méthode find ou la méthode select. méthode, elle finira par aller à Une méthode est la méthode de requête.

Il y a aussi une valeur d'attribut queryStr dans cette méthode, c'est-à-dire que l'instruction SQL est attribuée à ce moment, puis la méthode getLastSql est utilisée pour épisser le SQL à l'aide de l'attribut queryStr和bind . Enfin, l'instruction SQL est renvoyée.

La persévérance dans l'apprentissage, la persévérance dans les blogs et la persévérance dans le partage sont les convictions auxquelles Kaka a toujours adhéré depuis ses débuts. J'espère que les articles de Kaka sur le grand Internet pourront vous apporter un peu d'aide. Je m'appelle Kaka, à la prochaine fois.

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:
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