Maison > cadre php > PensezPHP > ThinkPHP : utilisation correcte des classes et des modèles Db

ThinkPHP : utilisation correcte des classes et des modèles Db

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

ThinkPHP : utilisation correcte des classes et des modèles Db

J'ai constaté que de nombreux développeurs ne comprennent pas la posture d'utilisation correcte de la base de données et du modèle lors de l'utilisation de ThinkPHP5.*, en particulier dans la version 5.1. Si vous n'utilisez pas la posture correcte suivante, là. sont Il est très probable que vous tombiez dans un piège.

La posture correcte de Db

Ce qui suit est l'utilisation officiellement recommandée de la classe Db (c'est-à-dire des appels de méthode statique à chaque fois)

// 查询单个数据
Db::name('user')->where('id', 1)->find();
// 查询多个数据
Db::name('user')->where('id', '>', 1)->select();
// 写入新的数据
Db::name('user')->insert(['name' => '张三']);
// 更新数据
Db::name('user')->where('id', 1)->update(['name' => '李四']);
// 删除数据
Db::name('user')->delete(1);
Copier après la connexion

De nombreux développeurs Pour simplifier le code, les lecteurs aiment utiliser le code suivant.

Cependant, n'utilisez jamais le code ci-dessous en 5.1 !

// 错误的用法

$user = Db::name('user');
// 查询单个数据
$user->where('id', 1)->find();
// 查询多个数据
$user->where('id', '>', 1)->select();
// 写入新的数据
$user->insert(['name' => '张三']);
// 更新数据
$user->update(['name' => '李四']);
// 删除数据
$user->delete(1);
Copier après la connexion

Même l'utilisation de la fonction d'assistance n'est toujours pas recommandée !

// 仍然是错误的用法

// 查询单个数据
db('user')->where('id', 1)->find();
// 查询多个数据
db('user')->where('id', '>', 1)->select();
// 写入新的数据
db('user')->insert(['name' => '张三']);
// 更新数据
db('user')->update(['name' => '李四']);
// 删除数据
db('user')->delete(1);
Copier après la connexion

De nombreux développeurs peuvent se demander pourquoi il s'agit d'une mauvaise utilisation ? Les résultats que j’ai utilisés sont évidemment bons, n’est-ce pas ? Cela signifie simplement que vous n’êtes pas encore tombé dans le piège.

La vraie raison est que la version 5.1 n'effacera pas les conditions de requête précédentes après chaque requête (5.0 les effacera à chaque fois), donc l'utilisation suivante est valide.

$user = Db::name('user');
// 查询分数大于80分的用户总数
$count = $user->where('score', '>', 80)->count();
// 查询分数大于80分的用户数据
$user->select();
Copier après la connexion

Vous devez comprendre après avoir vu cela que lorsque vous utilisez la même instance d'objet de requête de base de données, les conditions de requête seront toujours conservées (c'est-à-dire que cela entraînera une confusion dans les conditions de requête ultérieures), et si vous effectuez plusieurs opérations l'utilisation de fonctions d'assistance ou d'instanciation manuelle sera la même instance d'objet, sauf si vous l'effacez manuellement comme ci-dessous.

$user = Db::name('user');
// 查询分数大于80分的用户总数
$count = $user->where('score', '>', 80)->count();
// 清除查询条件(但不包括排序或者字段等信息)
$user->removeOption('where');
// 查询所有用户数据 并按分数倒序排列 
$user->order('score', 'desc')->select();
// 清除所有查询条件
$user->removeOption();
// 查询分数等于100的用户
$user->where('score', 100)->select();
Copier après la connexion

Bonne pratique : utiliser une nouvelle requête statique Db à chaque fois

Position correcte du modèle

Conception du model En fait, tout comme Db, il n'est fondamentalement pas nécessaire de l'instancier manuellement.

// 写入新的数据
$user = User::create(['name' => '张三']);
// 更新数据
$user->update(['name' => '李四']);

// 查询单个数据
$user = User::get(1);
// 删除当前模型数据
$user->delete();
Copier après la connexion

Dans le code ci-dessus, nous n'utilisons aucun code d'instanciation, nous utilisons tous des opérations de méthode statique. L'instanciation du modèle est automatiquement complétée par le système lors de l'interrogation ou de l'écriture des données. Si vous instanciez le modèle manuellement, cela entraînera le coût d'une instanciation répétée du modèle.

Utilisation non recommandée :

$user = new User;
// 写入新的数据
$user->name = '张三';
$user->save();
Copier après la connexion
$user = new User;
$user->find(1);
echo $user->name;
Copier après la connexion

Utilisation recommandée :

// 写入新的数据
User::create(['name' => '张三']);
$user = User::get(1);
echo $user->name;
Copier après la connexion

Donc, veuillez ne pas instancier le modèle manuellement, et il n'est pas recommandé d'utiliser la fonction d'aide au modèle.

Bonne pratique : utilisez des méthodes statiques pour la requête et la création de modèles

Maintenant, comprenez-vous la posture correcte pour utiliser les classes et les modèles Db ?

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/810719

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