原生查询 聚合查询
高级查询 视图查询
子查询

原生查询

参考资料:TP6 原生查询官方文档
原生查询可以说是让人又爱又恨
简单的语句用不到,复杂的语句用TP6 的构造器又更麻烦,导致无法彻底抛弃原生
query() 可执行任何原生语句
execute() 仅用于更新以及写入数据,不可做其他用处

因为execute() 在SQL语句无错误的情况下,仅返回受影响条数,否则返回false

<?php
namespace app\index\controller;

use app\BaseController;
use think\facade\Db;

class Index extends BaseController
{
    public function index()
    {
        //下面用原生查询 think_tp 表中的所有数据
        $sql = " SELECT * FROM think_tp ";
        dump(Db::query($sql));

        //用execute() 执行查询语句
        dump(Db::execute($sql));
    }
}

图↓

聚合查询

参考资料:TP6 聚合查询官方文档
在查询中,经常用到一些需要统计数据
count() 统计数量,参数是要统计的字段名(可选)
max() 获取最大值,参数是要统计的字段名(必须)
min() 获取最小值,参数是要统计的字段名(必须)
avg() 获取平均值,参数是要统计的字段名(必须)
sum() 获取总和,参数是要统计的字段名(必须)

<?php
namespace app\index\controller;

use app\BaseController;
use think\facade\Db;

class Index extends BaseController
{
    public function index()
    {
        //查询 think_tp 表数据总条数
        echo "count() 查询总条数";
        dump(Db::name("tp")->count());

        echo "查询 age 最大值";
        dump(Db::name("tp")->max("age"));

        echo "查询 age 最小值";
        dump(Db::name("tp")->min("age"));

        echo "查询 age 平均值";
        dump(Db::name("tp")->avg("age"));

        echo "查询 age 总和";
        dump(Db::name("tp")->sum("age"));
    }
}

图 ↓

注意:max() min() 支持第二个参数,是否开启强制转换,因为有时候,查询的字段并不都是数值
第二值默认为 true ,可传入 false 关闭强制转换

高级查询

参考链接:TP6 高级查询官方文档

1.快捷查询
快捷查询方式是一种多字段相同查询条件的简化写法
| 代表 or ,& 代表 and

<?php
namespace app\index\controller;

use app\BaseController;
use think\facade\Db;

class Index extends BaseController
{
    public function index()
    {
        //快捷查询 | 代表or ,& 代表 and
        $back = Db::name("tp")
            ->where("id|email","like","12%")
            ->where("id&age",">","9")
            ->select();

        echo Db::name("tp")
            ->where("id|emali","like","12%")
            ->where("id&age",">","9")
            ->fetchSql()
            ->select();

        dump($back);

    }
}

图 ↓

2.批量(字段)查询

基础用法

<?php
namespace app\index\controller;

use app\BaseController;
use think\facade\Db;

class Index extends BaseController
{
    public function index()
    {
        $back = Db::name("tp")
            ->where([
                ["email","like","123%"],
                ["id",">","4"]
            ])
            ->select();

        echo Db::name("tp")
            ->where([
                ["email","like","123%"],
                ["id",">","4"]
            ])
            ->fetchSql()
            ->select();

        dump($back);

    }
}

图 ↓

exp BUG疑问
此BUG(暂做BUG看)告诉我们,字段与字段比对,必须exp
whereExp()

<?php
namespace app\index\controller;

use app\BaseController;
use think\facade\Db;

class Index extends BaseController
{
    public function index()
    {
        $back = Db::name("tp")
            ->where([
                ["email","like","123%"],
                ["id",">","age"]
            ])
            ->select();
        echo Db::name("tp")
            ->where([
                ["email","like","123%"],
                ["id",">","age"]
            ])
            ->fetchSql()
            ->select();
        
        $back2 = Db::name("tp")
            ->where([
                ["email","like","123%"],
                ["id","exp",Db::raw(">age")]
            ])
            ->select();
        echo "<br>".Db::name("tp")
            ->where([
                ["email","like","123%"],
                ["id","exp",Db::raw(">age")]
            ])
            ->fetchSql()
            ->select();

        dump($back);
        dump($back2);
    }
}

图 ↓

注意:exp 必须配合 Db::raw() 使用

3.数组组合方式,直接变量组合

<?php
namespace app\index\controller;

use app\BaseController;
use think\facade\Db;

class Index extends BaseController
{
    public function index()
    {
        //数组查询方式,变量直接组合
        $email = "Sn";
        $nick = "s";
        $back = Db::name("tp")
            ->where([
                ["nickname","like",$nick."%"],
                ["email","like",$email."%"]
            ])
            ->select();

        echo Db::name("tp")
            ->where([
                ["nickname","like",$nick."%"],
                ["email","like",$email."%"]
            ])
            ->fetchSql()
            ->select();
        dump($back);
    }
}

图 ↓

4.闭包查询

<?php
namespace app\index\controller;

use app\BaseController;
use think\facade\Db;

class Index extends BaseController
{
    public function index()
    {
        //闭包查询
        $email = "Sn";
        $nick = "s";
        $back = Db::name("tp")
            ->where(function ($query) use ($email,$nick){
                $query->where([
                        ["nickname","like",$nick."%"],
                        ["email","like",$email."%"]
                ]);
            })
            ->select();

        echo Db::name("tp")
            ->where(function ($query) use ($email,$nick){
                $query->where([
                    ["nickname","like",$nick."%"],
                    ["email","like",$email."%"]
                ]);
            })
            ->fetchSql()
            ->select();
        dump($back);
    }
}

图 ↓

5.混合查询
只要符合语法规则的写法,都能同时一起写

<?php
namespace app\index\controller;

use app\BaseController;
use think\facade\Db;

class Index extends BaseController
{
    public function index()
    {
        //混合查询
        $email = "Sn";
        $nick = "s";
        $back = Db::name("tp")
            //变量组合写法
            ->where("nickname","like",$nick."%")
            //闭包写法
            ->where(function ($query) use ($email){
                $query->where([
                    ["email","like",$email."%"]
                ])
                //字符串写法
                ->whereOr("age > 0 and 1=1");
            })
            //快捷写法
            ->where("id|age",">",0)
            //字符串条件查询,绑定写法
            ->whereRaw("email like :email",["email" => $email."%"])
            ->select();

        echo Db::name("tp")
            ->where("nickname","like",$nick."%")
            ->where(function ($query) use ($email){
                $query->where([
                    ["email","like",$email."%"]
                ])
                    ->whereOr("age > 0 and 1=1");
            })
            ->where("id|age",">",0)
            ->whereRaw("email like :email",["email" => $email."%"])
            ->fetchSql()
            ->select();
        dump($back);
    }
}

图 ↓

6.更多快捷方法

视图查询

多表查询,join 的推荐替代方法

<?php
namespace app\index\controller;

use app\BaseController;
use think\facade\Db;

class Index extends BaseController
{
    public function index()
    {
        $back = Db::view("tp a","id,nickname")
            ->view("tp1 b","id,email,nickname","a.id = b.id","LEFT")
            ->where("a.id",">","5")
            ->select();

        echo Db::view("tp a","id,nickname")
            ->view("tp1 b","id,email,nickname","a.id = b.id","LEFT")
            ->where("a.id",">","5")
            ->fetchSql()
            ->select();

        dump($back);
    }
}

图 ↓

注意:如果使用数组形式设置别名,如果表名有前缀,需要写前缀
如 think_ 为表前缀,需写成 ['think_tp' => 'a'] 不然报错

子查询

参考资料:TP6 子查询官方文档

<?php
namespace app\index\controller;

use app\BaseController;
use think\facade\Db;

class Index extends BaseController
{
    public function index()
    {
        //其实子查询,就是利用TP 构造器返回 sql 语句 而不执行
        echo "fetchSql() 可以用在任何sql构造中,不仅限于 select() ";
        dump(
            Db::name("tp")
                ->where("id",">","5")
                ->fetchSql()
                ->select()
        );

        echo "buildSql() 一般纯用于构造sql 返回,后续不能跟随 select() update() 之类<br>
                并且可以返回到变量中,作为复用,此方法会把 sql 语句用()包裹起来";
        dump(
            Db::name("tp")
                ->where("id",">","5")
                ->buildSql()
        );

        echo "利用闭包特性,会在sql 构造中,把闭包内容用 ()包裹的特性";
        dump(
            Db::name("tp")
                ->where("id","in",function ($query){
                    $query->name("tp1")
                    ->where("id",">",5)
                    ->field("id");
                })
                ->fetchSql()
                ->select()
        );
    }
}

图 ↓