Requêtes avancées (Query Builder 9)
Requête rapide
La méthode de requête raccourcie est un moyen simplifié d'écrire les mêmes conditions de requête dans plusieurs champs et peut simplifier davantage l'écriture des conditions de requête. Utiliser | & pour les séparer. La requête AND peut réaliser la requête suivante, par exemple :
Db::table('think_user') ->where('name|title','like','thinkphp%') ->where('create_time&update_time','>',0) ->find();
La requête SQL générée est :
SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' OR `title` LIKE 'thinkphp%' ) AND ( `create_time` > 0 AND `update_time` > 0 ) LIMIT 1
La requête rapide prend en charge toutes les expressions de requête.
Requête par lots (champ)
Vous pouvez définir des requêtes conditionnelles par lots avec plusieurs conditions, par exemple :
Db::table('think_user') ->where([ ['name', 'like', 'thinkphp%'], ['title', 'like', '%thinkphp'], ['id', '>', 0], ['status', '=', 1], ]) ->select();
L'instruction SQL générée est :
SELECT * FROM `think_user` WHERE `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' AND `id` > 0 AND `status` = '1'
Mode tableau Si vous utilisez une requête exp, vous devez utiliser la méthode brute .
Db::table('think_user') ->where([ ['name', 'like', 'thinkphp%'], ['title', 'like', '%thinkphp'], ['id', 'exp', Db::raw('>score')], ['status', '=', 1], ]) ->select();
La méthode de requête Array garantit que votre tableau de requêtes ne peut pas être contrôlé par les données soumises par l'utilisateur. Les données du formulaire soumises par l'utilisateur doivent être transmises en tant qu'élément du tableau de requête, comme suit :
Db::table('think_user') ->where([ ['name', 'like', $name . '%'], ['title', 'like', '%' . $title], ['id', '>', $id], ['status', '=', $status], ]) ->select();
Notez que plusieurs conditions de requête. pour le même champ, il peut être fusionné. Si vous souhaitez que les conditions d'une certaine méthode Where soient traitées séparément, vous pouvez utiliser la méthode suivante pour éviter d'être affecté par d'autres conditions.
$map = [ ['name', 'like', 'thinkphp%'], ['title', 'like', '%thinkphp'], ['id', '>', 0], ]; Db::table('think_user') ->where([ $map ]) ->where('status',1) ->select();
L'instruction SQL générée est :
SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' AND `id` > 0 ) AND `status` = '1'
Faites bon usage des requêtes de tableau multidimensionnel, vous pouvez facilement assembler diverses instructions SQL complexes
Si vous utilisez la combinaison suivante de plusieurs conditions
$map1 = [ ['name', 'like', 'thinkphp%'], ['title', 'like', '%thinkphp'], ]; $map2 = [ ['name', 'like', 'kancloud%'], ['title', 'like', '%kancloud'], ]; Db::table('think_user') ->whereOr([ $map1, $map2 ]) ->select();
L'instruction SQL générée est :
SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' ) OR ( `name` LIKE 'kancloud%' AND `title` LIKE '%kancloud' )
Requête de fermeture
$name = 'thinkphp'; $id = 10; Db::table('think_user')->where(function ($query) use($name, $id) { $query->where('name', $name) ->whereOr('id', '>', $id); })->select();
L'instruction SQL générée est :
SELECT * FROM `think_user` WHERE ( `name` = 'thinkphp' OR `id` > 10 )
On peut voir que des crochets seront automatiquement ajoutés des deux côtés de chaque condition de fermeture.
Requête mixte
Vous pouvez combiner toutes les méthodes mentionnées précédemment pour effectuer des requêtes mixtes, par exemple :
Db::table('think_user') ->where('name', ['like', 'thinkphp%'], ['like', '%thinkphp']) ->where(function ($query) { $query->where('id', ['<', 10], ['>', 100], 'or'); }) ->select();
L'instruction SQL générée est :
SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `name` LIKE '%thinkphp' ) AND ( `id` < 10 or `id` > 100 )
Requête de condition de chaîne
Pour certaines requêtes vraiment complexes , vous pouvez également utiliser directement des instructions SQL natives pour interroger, par exemple :
Db::table('think_user') ->where('id > 0 AND name LIKE "thinkphp%"') ->select();
Pour des raisons de sécurité, nous pouvons utiliser la liaison de paramètres pour les conditions de requête de chaîne, par exemple :
Db::table('think_user') ->where('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%']) ->select();
Il est recommandé d'utiliser la méthodewhereRaw.
Db::table('think_user') ->whereRaw('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%']) ->select();
Utiliser la requête
Vous pouvez interroger en appelant une fois la méthode Where et en transmettant l'objet Query.
$query = new \think\db\Query; $query->where('id','>',0) ->where('name','like','%thinkphp'); Db::table('think_user') ->where($query) ->select();
La méthode Where de l'objet Query ne peut être appelée qu'une seule fois et ne peut être appelée que dans la méthode Where. Si une méthode de chaîne de conditions sans requête est utilisée dans l'objet de requête, la requête actuelle ne sera pas transmise.
$query = new \think\db\Query; $query->where('id','>',0) ->where('name','like','%thinkphp') ->order('id','desc') // 不会传入后面的查询 ->field('name,id'); // 不会传入后面的查询 Db::table('think_user') ->where($query) ->where('title','like','thinkphp%') // 有效 ->select();
Méthodes de raccourci
Le système encapsule une série de méthodes de raccourci pour simplifier les requêtes, notamment :
Méthode | Fonction |
---|---|
whereOr whereOr | 字段OR查询 |
whereXor | 字段XOR查询 |
whereNull | 查询字段是否为Null |
whereNotNull | 查询字段是否不为Null |
whereIn | 字段IN查询 |
whereNotIn | 字段NOT IN查询 |
whereBetween | 字段BETWEEN查询 |
whereNotBetween | 字段NOT BETWEEN查询 |
whereLike | 字段LIKE查询 |
whereNotLike | 字段NOT LIKE查询 |
whereExists | EXISTS条件查询 |
whereNotExists | NOT EXISTS条件查询 |
whereExp | 表达式查询 |
whereColumn | 比较两个字段 |
下面举例说明下两个字段比较的查询条件whereColumn方法的用法。
查询update_time大于create_time的用户数据
Db::table('think_user') ->whereColumn('update_time','>','create_time') ->select();
生成的SQL语句是:
SELECT * FROM `think_user` WHERE ( `update_time` > `create_time` )
查询name和nickname相同的用户数据
Db::table('think_user') ->whereColumn('name','=','nickname') ->select();
生成的SQL语句是:
SELECT * FROM `think_user` WHERE ( `name` = `nickname` )
相同字段条件也可以简化为
Db::table('think_user') ->whereColumn('name','nickname') ->select();
支持数组方式比较多个字段
Db::name('user')->whereColumn([ ['title', '=', 'name'], ['update_time', '>=', 'create_time'], ])->select();
生成的SQL语句是:
SELECT * FROM `think_user` WHERE ( `name` = `nickname` AND `update_time` > `create_time` )
动态查询
查询构造器还提供了动态查询机制,用于简化查询条件,包括:
动态查询 | 描述 |
---|---|
whereFieldName | 查询某个字段的值 |
whereOrFieldName | 查询某个字段的值 |
getByFieldName | 根据某个字段查询 |
getFieldByFieldName | champ OU requête
champ XOR requête
whereNull
Demander si le champ est nul
whereNotNull
Demander si le champ n'est pas nul
🎜whereIn
🎜🎜Field DANS la requête 🎜🎜🎜🎜whereNotIn
🎜🎜champ PAS DANS la requête🎜🎜🎜🎜whereBetween
🎜🎜champ ENTRE requête🎜🎜🎜🎜whereNotBetween
🎜 🎜champ PAS ENTRE la requête🎜🎜🎜🎜whereLike
🎜🎜champ LIKE requête🎜🎜🎜🎜whereNotLike
🎜🎜champ PAS COMME la requête🎜🎜🎜🎜whereExists code> 🎜🎜Requête de condition EXISTE🎜🎜🎜🎜whereNotExists
🎜🎜NOT EXISTS requête de condition🎜🎜🎜🎜whereExp
🎜🎜requête d'expression🎜🎜🎜🎜whereColumn< / code>🎜🎜Comparer deux champs🎜🎜🎜🎜🎜Ce qui suit est un exemple d'utilisation de la méthode WhereColumn pour comparer les conditions de requête entre deux champs. 🎜🎜🎜Interroger les données utilisateur dont update_time est supérieur à create_time🎜// 根据邮箱(email)查询用户信息
$user = Db::table('user')
->whereEmail('thinkphp@qq.com')
->find();
// 根据昵称(nick_name)查询用户
$email = Db::table('user')
->whereNickName('like', '%流年%')
->select();
// 根据邮箱查询用户信息
$user = Db::table('user')
->getByEmail('thinkphp@qq.com');
// 根据昵称(nick_name)查询用户信息
$user = Db::table('user')
->field('id,name,nick_name,email')
->getByNickName('流年');
// 根据邮箱查询用户的昵称
$nickname = Db::table('user')
->getFieldByEmail('thinkphp@qq.com', 'nick_name');
// 根据昵称(nick_name)查询用户邮箱
$email = Db::table('user')
->getFieldByNickName('流年', 'email');
🎜L'instruction SQL générée est :🎜Db::name('user')->when($condition, function ($query) {
// 满足条件后执行
$query->where('score', '>', 80)->limit(10);
})->select();
🎜Interroger les données utilisateur avec le même nom et le même pseudo🎜Db::name('user')->when($condition, function ($query) {
// 满足条件后执行
$query->where('score', '>', 80)->limit(10);
}, function ($query) {
// 不满足条件执行
$query->where('score', '>', 60);
});
🎜L'instruction SQL générée est :🎜rrreee🎜La même condition de champ peut également être simplifié pour🎜 rrreee🎜 prend en charge la comparaison de tableaux de plusieurs champs🎜rrreee🎜L'instruction SQL générée est :🎜rrreee🎜🎜Requête dynamique🎜🎜🎜🎜Le constructeur de requête fournit également un mécanisme de requête dynamique pour simplifier les conditions de requête, notamment :🎜🎜 🎜🎜 🎜Requête dynamique🎜🎜Description🎜🎜🎜🎜🎜🎜whereFieldName
🎜🎜Interroger la valeur d'un certain champ🎜🎜🎜🎜whereOrFieldName
🎜🎜Interroger la valeur d'un certain champ🎜🎜 🎜🎜getByFieldName
🎜🎜Requête basée sur un certain champ🎜🎜🎜🎜getFieldByFieldName
🎜🎜Obtenir une certaine valeur basée sur un certain champ🎜🎜🎜🎜🎜 où FieldName représente la table de données La représentation en cas de chameau du nom réel du champ En supposant qu'il y ait des champs email et nick_name dans la table de données de l'utilisateur, nous pouvons interroger comme ceci. 🎜🎜rrreee🎜Les méthodes getBy et getFieldBy n'interrogeront qu'un seul enregistrement et peuvent être utilisées conjointement avec d'autres méthodes de chaîne 🎜🎜🎜Requête conditionnelle🎜🎜🎜🎜Le constructeur de requêtes prend en charge les requêtes conditionnelles, telles que : 🎜rrreee🎜 et prend en charge les conditions qui le font ne remplit pas les conditions Requête de branche🎜rrreee🎜 🎜