Sous-requête (générateur de requêtes 12)


Construisez d'abord la sous-requête SQL Vous pouvez utiliser les trois méthodes suivantes pour construire la sous-requête.

Utiliser la méthode fetchSql

La méthode fetchSql signifie ne pas interroger mais renvoie simplement l'instruction SQL construite, et prend non seulement en charge la sélection, mais prend également en charge toutes les requêtes CURD. Le résultat de la sous-requête générée par

$subQuery = Db::table('think_user')
    ->field('id,name')
    ->where('id', '>', 10)
    ->fetchSql(true)
    ->select();

est :

SELECT `id`,`name` FROM `think_user` WHERE `id` > 10

Utilisation de buildSql pour construire une sous-requête

$subQuery = Db::table('think_user')
    ->field('id,name')
    ->where('id', '>', 10)
    ->buildSql();

Le résultat de la sous-requête générée est :

( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 )

Après avoir appelé la méthode buildSql, l'opération de requête réelle ne sera pas effectuée, mais uniquement la requête sera générée. L'instruction SQL (afin d'éviter toute confusion, des parenthèses seront ajoutées des deux côtés du SQL), puis nous l'appellerons directement dans les requêtes suivantes.

Ensuite, utilisez la sous-requête pour construire une nouvelle requête :

Db::table($subQuery . ' a')
    ->where('a.name', 'like', 'thinkphp')
    ->order('id', 'desc')
    ->select();

L'instruction SQL générée est :

SELECT * FROM ( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 ) a WHERE a.name LIKE 'thinkphp' ORDER BY `id` desc

Utilisez la fermeture pour construire la sous-requête

Des requêtes telles que IN/NOT IN et EXISTS/NOT EXISTS peuvent être utilisées directement la fermeture en tant que sous-requête, par exemple :

Db::table('think_user')
    ->where('id', 'IN', function ($query) {
        $query->table('think_profile')->where('status', 1)->field('id');
    })
    ->select();

L'instruction SQL générée est

SELECT * FROM `think_user` WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 )
Db::table('think_user')
    ->whereExists(function ($query) {
        $query->table('think_profile')->where('status', 1);
    })->find();

L'instruction SQL générée est

SELECT * FROM `think_user` WHERE EXISTS ( SELECT * FROM `think_profile` WHERE `status` = 1 )

En plus des conditions de requête ci-dessus, les opérations de comparaison prennent également en charge l'utilisation de sous-requêtes de fermeture