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);
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);
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);
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();
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();
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();
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();
$user = new User; $user->find(1); echo $user->name;
Utilisation recommandée :
// 写入新的数据 User::create(['name' => '张三']); $user = User::get(1); echo $user->name;
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!