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éthodeFonction
whereOrwhereOr字段OR查询
whereXor字段XOR查询
whereNull查询字段是否为Null
whereNotNull查询字段是否不为Null
whereIn字段IN查询
whereNotIn字段NOT IN查询
whereBetween字段BETWEEN查询
whereNotBetween字段NOT BETWEEN查询
whereLike字段LIKE查询
whereNotLike字段NOT LIKE查询
whereExistsEXISTS条件查询
whereNotExistsNOT 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` )

动态查询

查询构造器还提供了动态查询机制,用于简化查询条件,包括:

champ OU requêtewhereXor
动态查询描述
whereFieldName查询某个字段的值
whereOrFieldName查询某个字段的值
getByFieldName根据某个字段查询
getFieldByFieldName

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