ThinkPHP教程

news2024/11/25 7:04:07
thinkPHP笔记

01. phpEnv配置安装

主讲老师 - 李炎恢

1. 学习基础

  • ThinkPHP8.x:
    • 前端基础:HTML5/CSS(必须)、JavaScript(可选、但推荐有);
    • 后端基础:PHP基础,版本不限,但不能太老,至少PHP5.4以上语法,TP8是兼容PHP8.x的;
    • 数据库基础:MySQL数据库,掌握了常规的SQL语句。
    • 编码思维基础:MVC、MVVM、设计模式(单例、观察者等)有简单认知即可;

2. 软件获取

  • phpEnv:

  • 官方网站:https://www.phpenv.cn/ (专业优雅强大的PHP集成环境);

    • 下载最新版本,自动安装后(默认C盘,可选),界面如下:

  • 简单配置:

    • 应用软件->设置->开启CDN加速(方便我们后续安装各种软件);

    • 安装 PHP8.2 和 MySQL8 ,选择 Apache (个人向,教学方便);

    • 然后点击 启动服务 ,允许各种允许访问即可;

    • 在浏览器输入:localhost,即可访问PHP探针。

  • 创建站点:

    • 点击 主页 下 网站,添加一个虚拟网站,以便后续学习测试;

    • 可以选择自定义的目录,我教学方便,就默认了;

    • 添加后,会写入hosts,这样我们输入 www.tp.com 域名后就可以访问了;

    • 默认会给你一个index.php,显示结果为:php8.2 info

02. ThinkPHP8.x配置安装

主讲老师 - 李炎恢

1. 8.x安装

  • 主要特性:(来自手册)

    • 支持PHP8强类型、支持6.x无缝升级、语义化版本策略、升级PSR规范依赖版本;
  • 安装方式:

    • 仅在windows教学,Linux或其它平台对照手册执行即可;
    • 键盘:win + R,输入cmd,输入composer,判断是否已经安装;
    • 如果没有安装composer,则:https://getcomposer.org/Composer-Setup.exe (来自手册);
    • 切换至你项目的根目录,比如第一节课创建的 www.tp.com 文件夹的上一层 www;
    • 输入安装命令:composer create-project topthink/think www.tp.com;
    • 注意:被安装的文件夹必须是空的,先要删除里面的内容;
    • 各种超时,可以先修改成国内源,比如阿里:
    • composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
    • 查看是否成功:composer config -g -l

2. 启动程序

  • IDE载入

    • 开发工具任意,因为我们在浏览器测试即可,我这里选择了phpStorm,备选如下:
      • VS Code
      • sublime Text4
      • Zend Stduio
    • 载入项目后,在IDE的终端输入内置服务器命令:php think run,启动Web服务;
    • 访问方式为:www.tp.com:8000 ,默认端口8000,当然也有80端口,不过被占用了;
    • 此时,我们发现,phpEnv还没启动呢,怎么就可以访问了呢?
    • 官方手册 -> 命令行 -> 启动内置服务器,有讲,这是内置的Web服务器,其它服务没有;
      • 所以学习使用时,推荐开启着,比如数据库连接等服务还需要。
  • 删除广告

    • ThinkPHP8.x目前非常的商业化,打开后,广告糊一脸,我们先把这个去掉。
    • 在app/controller/index.php中的index方法,自定义return结果即可。
    • 或者执行phpinfo()函数,来检测php版本。
  • 配色问题

    • 我个人开发学习,都是用的深色背景,明亮代码,一般开发工具都是默认这个样式;
    • 也推荐学习者,也用这个默认或差不过的样式,用于保护眼睛和缓解视觉疲劳;
    • 但如果讲课,我一般采用的都是亮色背景,原因如下:
      • 场景切换:如果是深色,切换到亮色界面,对学习者那么一闪,暴击效果显著;
      • 专注力:深色的背景,更加容易让听课者昏睡,注意力不集中;
      • 上课时长:每节课10分钟上下,并不会太疲劳,自己长时间开发用深色;

03. 编码规范.目录.配置

主讲老师 - 李炎恢

1. 编码规范

  • 完全版参考手册,这里说重点:
    • TP8遵循PSR-2命名规范、PSR-4自动加载规范;
    • 类名和文件名保持一致,驼峰式命名(首字母大写)如:Index,BaseController
    • 方法和函数名用驼峰式命名(首字母小写)如:index(),hello()
    • 数据表和字段用蛇式命名(两个单词中间下划线)如:think_name,user_name
    • 更多对照手册

2. 目录结构

  • 对于初学者,一个个说是干啥的,没有意义,这里说重点:

    • app目录是应用目录,我们开发程序就在这个目录
    • config是配置目录,顾名思义,配置程序状态
    • public是公共目录,对外访问目录,运行程序默认执行此目录的index.php
    • 剩下的,后续学到一个,讲一个。

3. 配置定义

  • 默认情况下,程序出错会显示:页面出错!请稍候再试~

  • 这种情况,一般是应用部署好后,万一出错给用户看的;

  • 如果我们自己在开发阶段,需要开启调试模式,来提示具体的错误信息:

    • 在根目录有一个文件:.example.env,改成 .env ,也就是去掉点前面;
    • 然后在配置信息的第一行:APP_DEBUG = true 即可,false则不开启。
  • 调试模式开启后,可以发现右下角会出现trace调试工具小图标:

    • 包含了丰富的调试内容:具体自点查看。

04. URL访问模式

主讲老师 - 李炎恢

1. 单应用URL

http://serverName/index.php/控制器/操作/参数/值…
  • 注意:这里服务器启动是 php think run 的内置服务器,下节课会探讨外置服务器;

  • 结构分析:

    • serverName就是我们的:www.tp.com:8000;

    • index.php 是入口文件,带上 / ;

    • 控制器是app\controller\Index.php中的 Index 这个名称,也就是类名;

    • 操作是类里面的方法名,比如:index(默认方法),hello(普通方法);

    • 默认方法可以省略,会直接方法,其他普通方法需要键入方法名:

      • http://www.tp.com:8000/index.php/Index (默认执行index操作)
      • http://www.tp.com:8000/index.php/Index/index (完整路径)
      • http://www.tp.com:8000/index.php/Index/test (普通方法,必须完整路径)
    • 系统默认自带的hello方法,是针对后续路由课程的,在路由文件设置过导致无效;

    • 我们在config/app.php中将路由关闭:“with_route” => false,

      • http://www.tp.com:8000/index.php/Index/hello (执行默认参数值)
      • http://www.tp.com:8000/index.php/Index/hello/name/World(修改参数值)
    • 参数不够直观,尤其多参数的时候,也是支持传统方案的:

      • http://www.tp.com:8000/index.php/Index/hello?name=World (问号键值对)

2. 多应用URL

http://serverName/index.php/应用/控制器/操作/参数/值…
  • 如果开启多应用的话,URL比单应用多一个 应用 路径,其它一致;
  • 由于我们教学,都在单应用上,暂时不刻意演示,如果后续有机会,放到最后;

05. 内.外置服务器

主讲老师 - 李炎恢

1. 启动内置

  • 在手册命令行 -> 启动内置服务器,有 php think run 启动的服务器介绍;
  • 启动后直接输入:127.0.0.1:8000 或 localhost:8000 或 www.tp.com:8000 访问;
  • 停止内置服务器,在命令行使用 ctrl + c

2. 启动phpEnv

  • 不管是本地的外置服务器集成环境phpEnv,还是以后要部署到远程服务器,都需要配置;

  • 这里需要配置的重点就是伪静态,我们不启动内置服务器,只用外置访问试试;

  • 注意:这里外置服务器,在第一课我们已经创建了 端口为 80 的 www.tp.com;

  • 现在,直接访问试试?但出现了如下图的错误:

  • 我们在 www.tp.com 目录下创建一个index.html或index.php索引文件,访问后:

3. 配置目录

  • 在第一节课,我们创建的启动目录是 www.tp.com ,但目前知道这个目录下没有 index.php;
  • 在手册的 基础 -> 目录结构 中 public 目录 解释为:WEB目录(对外访问目录);
  • 并规范到:在实际项目部署中,确保只将 public 对外访问;
  • 所以,我们将phpEnv站点配置目录设置为:www.tp.com/pubic 即可;
  • 至于http.conf、伪静态和.htaccess等配置信息,默认情况下支持都用,后续需要配置再说;

06. 控制器的定义

主讲老师 - 李炎恢

1. 定义方式

  • 控制器:顾名思义MVC中的C,即逻辑控制定义;

  • 默认在app\controller下编写对应的控制器类文件,如果想改默认目录:

    // 访问控制器层名称
    "controller_layer"      => "controller",
    
  • 类名和文件名大小写保持一致,并采用驼峰式(首字母大写);

    // app\controller\User.php
    namespace app\controller;
    
    class User
    {
         
        public function index()
        {
         
            return "用户";
        }
        
        public function login()
        {
         
            return "登录成功!";
        }
    }
    
    • User类创建两个方法 index(默认)和 login,访问 URL 如下:
    • http://www.tp.com:8000/Index.php/user/
    • http://www.tp.com:8000/Index.php/user/login
  • 那么如果创建的是双字母组合,比如 class HelloWorld,访问 URL 如下:

  • http://www.tp.com:8000/Index.php/helloworld

  • http://www.tp.com:8000/Index.php/hello_world

    namespace app\controller;
    
    class HelloWorld
    {
         
        public function index()
        {
         
            return "index";
        }
    }
    

2. URL重写

  • URL重写可以省去 index.php 入口文件的键入,默认情况下内置服务器支持重写;

    http://www.tp.com:8000/User

  • 而外置服务器,比如phpEnv,省略了入口文件,则出现如下问题:

  • 查看手册,根据它URL重写的修改方案(Apache),需要修改.htaccess最后一行:

    #RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]  Apache替换成下面一行
    RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
    

  • 备注:不同的环境、服务器等等都会有千奇百怪的问题,努力搜索解决即可;

  • 如果实在解决不了,请就用 php think run 内置服务器就了,省事。

  • 到时候部署到真实服务器环境,再折腾。。。

3. 配置渲染

  • 如果你想避免引入同类名时的冲突,可以 config\route.php 设置控制器后缀:

    // 是否使用控制器后缀
    // 此时,User.php 就必须改成 UserController.php,并类名也需要增加后缀
    "controller_suffix"  => true,
    
  • ThinkPHP 直接采用方法内 return 返回的方式直接就输出了;

  • 如果需要使用 json 输出,直接采用 json 函数;

    // json输出,不同浏览器美化样式不同,我这里用的FireFox
    public function json()
    {
         
    	return json(["name" => "王二狗", "age" => 25, "gender" => "男"]);
    }
    
  • 不推荐使用 die、exit 等 PHP 方法中断代码执行,推荐助手函数 halt();

    halt("中断测试");
    

07. 基础和空控制器

主讲老师 - 李炎恢

1. 基础控制器

  • 一般来说,创建控制器后,推荐继承基础控制器来获得更多的功能方法;

  • 基础控制器仅仅提供了控制器验证功能,并注入了think\App和think\Request;

  • 这两个对象后面会有章节详细讲解,下面我们继承并简单使用一下;

    namespace app\controller;
    use app\BaseController;
    
    class User extends BaseController
    {
         
        public function index()
        {
         
            // 返回实际路径
            return $this->app->getBasePath();
            // 返回当前方法名
            return $this->request->action();
        }
    }
    

2. 空控制器

  • 空控制器一般用于载入不存在的控制器时,进行错误提示;

    class Error
    {
         
        public function __call(string $name, array $arguments)
        {
         
            return "当前控制器不存在!";
        }
    }
    

08. 创建数据表及填充

主讲老师 - 李炎恢

1. 创建数据表

  • 我们直接使用phpEnv自带的MySQL操作软件:HeidiSQL,简称HS;

  • 登录的时候,注意修改root和密码后,保存,下次方可直接打开;

  • 首先,我们创建一个数据库:demo,用于测试:

2. 创建用户表

  • 设置好数据库后,我们创建一个user表,包含id、name、age、gender、details等字段;

  • 然后,我们填充一些数据,方便查询测试:

  • 最后,我们通过SQL语句来测试一下:

09. 连接数据库和查询

主讲老师 - 李炎恢

1. 连接数据库

  • 我们可以在 config\database.php 配置文件中设置与数据库的连接信息:

    • 如果是一般性数据库连接,在 ‘’connections‘’ 配置区设置即可;

    • 如果是本地测试,它会优先读取 .env 配置,然后再读取 database.php 的配置;

      # .env文件,部署服务器,请禁用我
      APP_DEBUG = true
      
      DB_TYPE = mysql
      DB_HOST = 127.0.0.1
      DB_NAME = demo
      DB_USER = root
      DB_PASS = 123456
      DB_PORT = 3306
      DB_CHARSET = utf8
      
      DEFAULT_LANG = zh-cn
      
    • 如果禁用了 .env 配置,则会读取数据库连接的默认配置:

      // 数据库连接配置信息
      "connections"     => [
          "mysql" => [
              // 数据库类型
              "type"            => env("DB_TYPE", "mysql"),
              // 服务器地址
              "hostname"        => env("DB_HOST", "127.0.0.1"),
              // 数据库名
              "database"        => env("DB_NAME", "demo"),
              // 用户名
              "username"        => env("DB_USER", "root"),
              // 密码
              "password"        => env("DB_PASS", "123456"),
              // 端口
              "hostport"        => env("DB_PORT", "3306"),
      

2. PHP获取数据

  • 我们暂时没有详细学习此类语法,可以简单用一些了解一下即可:

    // 引入Db数据库类
    use think\facade\Db;
    
    class User extends BaseController
    {
         
        public function get()
        {
         
            // 连接user表,查询
            $user = Db::table("user")->select();
            // 输出数据
            return json($user);
        }
    }
    

10. 构造器之数据查询

主讲老师 - 李炎恢

1. table方法

  • Db类旗下有一个 table 静态调用的方法,参数为完整的表名(前缀都不能省略);

  • 如果希望只查询一条数据,可以使用 find() 方法,需指定 where 条件:

    // 通过ID查询指定的数据
    // find 方法查询结果不存在,返回 null,否则返回结果数组
    $user = Db::table("user")->where("id", 1)->find();
    
  • 想要了解执行的原生SQL是什么,可以注释掉 return 直接通过 trace 查看;

  • 使用 findOrEmpty() 方法也可以查询一条数据,但在没有数据时返回一个空数组:

    // 没有数据返回空数组
    $user = Db::table("user")->where("id", 11)->findOrEmpty();
    
  • 使用 findOrFail() 方法同样可以查询一条数据,在没有数据时抛出一个异常:

    // 没有数据抛出异常
    $user = Db::table("user")->where("id", 11)->findOrFail();
    
  • 想要获取多列数据,可以使用 select() 方法:

    // 查询所有数据
    $user = Db::table("user")->select();
    
  • select() 方法默认返回 Collection 对象的数据集,可以通过 toArray() 方法转换成数组:

    // 用中断函数,来检测返回值
    $user = Db::table("user")->select();
    halt($user);
    
    // 转换成数组
    $user = Db::table("user")->select()->toArray();
    halt($user);
    
  • 多列数据也可以参与 where() 方法的筛选:

    // 多列筛选
    $user = Db::table("user")->where("age", 14)->select();
    

2. 链式查询

  • 我们发现通过指向符号 “->” 多次连续调用方法称为:链式查询;
  • 当 Db::table(“user”) 时,返回查询对象(Query),即可连缀数据库对应的方法;
  • 当返回查询对象(Query)时,就可以继续调用链式方法,where() 也是链式方法;
  • 而 where() 被调用后,依旧返回(Query),可以再次链式调用;
  • 在手册 数据库 -> 查询构造器 -> 链式操作 可以了解所有可链式的方法:table、where等;
  • 直到遇到 find() 或 select() 返回数组或数据集时,结束查询;

11. 表前缀之扩展查询

主讲老师 - 李炎恢

1. 表前缀

  • 一般来说,为了保持表名统一性和防止冲突,都会给表加上一个前缀,以下划线结束;

    • 比如:tp_user,这里的 tp_ 就是表前缀,所有;

    • 我们修改MySQL中表名,然后刷新程序,报错;

    • 当然,你可以传递 Db::table(“tp_user”),但没必要;

  • 首先,我们可以来配置统一前缀:

    • 在 .env 文件中 添加:DB_PREFIX = tp_

    • 如果部署环境 database.php 中 设置

      "prefix" => env("DB_PREFIX", "tp_"),
      
  • 然后,使用 Db::name(“user”) 方法即可:

    // 此时,tp_ 表名的前缀可以省略
    $user = Db::name("user")->select();
    

2. 扩展查询

  • 通过 value() 方法,可以查询指定字段的值(单个),没有数据返回 null

    // value() 方法查询单个列值
    $user = Db::name("user")->where("id", 3)->value("name");
    
  • 通过 colunm() 方法,可以查询指定列的值(多个),没有数据返回空数组;

    // colunm() 方法查询多个列值
    $user = Db::name("user")->column("name");
    // 通过id 作为索引
    $user = Db::name("user")->column("name,age", "id");
    
  • 当大量数据需要 批处理 时,比如给所有用户更新数据,就不能一次性全取出来,一批一批的来;

    // 批量处理
    Db::name("user")->chunk(2, function ($users) {
         
        foreach ($users as $user) {
         
            dump($user);
        }
        echo 1;
    });
    
    // 通过获取最后的SQL语句,发现用的是LIMIT 2
    return Db::getLastSql();
    
  • 另一种处理大量数据:游标查询,为了解决内存开销,每次读取一行,并返回到下一行再读取;

    // 批量处理2
    $users = Db::name("user")->cursor();
    // PHP生成器
    // halt($user);
    foreach ($users as $user) {
         
        dump($user);
    }
    

12. 数据的新增方式

主讲老师 - 李炎恢

1. 单条新增

  • 使用 insert() 方法可以向数据表添加一条数据,更多的字段采用默认;

    // 数据
    $data = [
        "name"    => "张麻子",
        "age"     => 28,
        "gender"  => "男",
        "details" => "我脸上没有麻子!"
    ];
    
    // 单条新增,成功返回1
    return Db::name("user")->insert($data);
    
  • 如果想强行新增抛弃不存在的字段数据,则使用 strick(false) 方法,忽略异常;

    // 数据
    $data = [
        "name"    => "马邦德",
        "age"     => 30,
        "gender"  => "男",
        "deta" => "我脸上没有麻子!"
    ];
    
    // 单条新增,成功返回1
    return Db::name("user")->strict(false)->insert($data);
    
  • 如果我们采用的数据库是 mysql,可以支持 replace 写入;

  • insert 和 replace insert 写入的区别,前者表示表中存在主键相同则报错,后者则修改;

    // 新增数据时,主键冲突时,直接修改这条记录
    Db::name("user")->replace()->insert($data);
    
  • 使用 insertGetId() 方法,可以在新增成功后返回当前数据 ID;

    // 返回自增ID
    return Db::name("user")->replace()->insertGetId($data);
    

2. 多条新增

  • 使用 insertAll() 方法,可以批量新增数据,但要保持数组结构一致;

    // 数据
    $data = [[
        "name"    => "林克",
        "age"     => 19,
        "gender"  => "男",
        "details" => "先收集999个呀哈哈!"
    ],[
        "name"    => "普尔亚",
        "age"     => 100,
        "gender"  => "女",
        "details" => "我先来个返老还童,再快速长大!"
    ]];
    
    return Db::name("user")->insertAll($data);
    
  • insertAll() 方法 也支持 replace 写入,如果添加数据量大,可以通过 -> limit() 方法限制添加数量;

    Db::name("user")->replace()->limit(100)->insertAll($data);
    

13. 更新删除和save方法

主讲老师 - 李炎恢

1. 数据修改

  • 使用 update() 方法来修改数据,修改成功返回影响行数,没有修改返回 0

    // 修改的数据
    $data = [
        "name" => "王三狗",
        "age"  => "13",
    ];
    
    // 执行修改并返回
    return Db::name("user")->where("id", 4)->update($data);
    
  • 如果修改数据包含了主键信息,比如 id,那么可以省略掉 where 条件;

    // 修改的数据
    $data = [
        "id"   => 4,
        "name" => "王三狗",
        "age"  => "13",
    ];
    
    // 执行修改并返回
    return Db::name("user")->update($data);
    
  • 如果想让一些字段修改时执行 SQL 函数操作,可以使用 exp() 方法实现;

    // 让details字段内的英文大写
    return Db::name("user")->exp("details", "UPPER(details)")->update($data);
    
  • 如果要自增/自减某个字段,可以使用 inc/dec 方法,并支持自定义步长;

    // 修改时,让age自增和自减,默认1,要去掉$data里面age字段的修改,不然冲突
    return Db::name("user")->inc("age")->dec("age", 2)->update($data);
    
    // 派生自字段,延迟执行,毫秒
    setInc("age", 1, 600)
    setDec("age", 2, 600)
    
  • 使用 Db::raw() 来设置每个字段的特殊需求,灵活且清晰:

    // 使用Db::raw 更加清晰灵活
    Db::name("user")->where("id", 4)->update([
        "details"   =>  Db::raw("UPPER(details)"),
        "age"       =>  Db::raw("age-2")
    ]);
    return Db::getLastSql();
    
  • save() 方法是一个通用方法,可以自行判断是新增还是修改(更新)数据;

    // 包含主键,即修改;否则,新增
    return Db::name("user")->save($data);
    

2. 数据删除

  • 极简删除可以根据主键直接删除,删除成功返回影响行数,否则 0;

    // 根据主键删除
    Db::name("user")->delete(8);
    
  • 根据主键,还可以删除多条记录;

    // 根据主键删除多条
    Db::name("user")->delete([48,49,50]);
    
  • 正常情况下,通过 where()方法来删除;

    // 条件删除
    Db::name("user")->where("id", 47)->delete();
    
  • 清空表以及逻辑软删除,参考手册即可;逻辑软删除,在模型篇单独讲解,这里略过。

14. 查询表达式规则

主讲老师 - 李炎恢

1. 表达式查询

  • 查询表达式支持大部分常用的 SQL 语句,语法格式如下:

    where("字段名","查询表达式","查询条件");
    
  • 所有的表达式,查阅手册 -> 查询表达式 中的表格即可;这里列出几个意思一下:

    表达式 含义 快捷方式
    = 等于
    <= time 小于等于某个时间 whereTime
    EXP SQL表达式查询 whereExp
    [NOT] LIKE 模糊查询 whereLike
    [NOT] IN [非] IN 查询 whereIN

2. 查询示例

  • 条件判断类的,id大于4的;

    // 查询id大于4的数据
    $user = Db::name("user")->where("id", ">", 4)->select();
    return json($user);
    
  • Like模糊查询,姓王的;

    // 查询姓王的用户
    $user = Db::name("user")->where("name", "like", "王%")->select();
    // like快捷方式
    $user = Db::name("user")->whereLike("name", "王%")->select();
    
  • IN区间查询,根据id;

    // 区间查询,支持not in
    $user = Db::name("user")->where("id", "in", "1, 3, 5")->select();
    // 语义更好一点
    $user = Db::name("user")->where("id", "in", [1,3,5])->select();
    // IN快捷查询,两种均可,支持whereNotIn
    $user = Db::name("user")->whereIn("id", [1, 2, 3])->select();
    
    // Between,和IN一样 支持 not between
    $user = Db::name("user")->where("id", "between", [2,5])->select();
    // 快捷方式和IN一样:whereBetween和whereNotBetween
    
  • NULL查询;

    // NULL,  null 或 not null:
    $user = Db::name("user")->where("details", "not null")->select();
    // 快捷方式:whereNull和whereNotNull
    
  • EXP查询,自定义SQL片段;

    // EXP查询,自定义SQL
    $user = Db::name("user")->where("id", "EXP", "<> 8 and id >5")->select();
    // 快捷查询
    $user = Db::name("user")->whereExp("id","<> 8 and id >5")->select();
    
  • 这里推荐:有快捷方式的用快捷方式,通过Ctrl+方法名得知,快捷方式绕过了很多拼装流程,速度更快;

15. 超多查询都不讲

主讲老师 - 李炎恢
  • 警告:这里罗列了大量的快捷查询的示例、链式查询以及其它非常用的查询方法;
  • 介于TP6课程大家的反馈,我这里不再详细讲解每个方法的用法;
  • 但我会录入在讲义里,方便后续项目课程时候回头查阅;后续类似的知识点也这么砍;

1. 字符串条件(不讲)

  • whereRaw 可以直接写入多条件:

    // 多条件字符串
    $user = Db::name("user")->whereRaw("age > 15 AND gender=""")->select();
    
  • 包含变量的多条件查询:

    // 变量
    $age = 15;
    $gender = "女";
    
    // 预处理机制
    $user = Db::name("user")->whereRaw("age>:age AND gender=:gender", [
        "age"       => $age,
        "gender"    => $gender
    ])->select();
    

2. field()字段筛选(不讲)

  • 使用 field() 方法,可以指定要查询的字段;

    // 字段筛选
    $user = Db::name("user")->field("id, age, gender")->select();
    $user = Db::name("user")->field(["id, age, gender"])->select();
    
  • 使用 field() 方法,给指定的字段设置别名;

    // 字段别名
    $user = Db::name("user")->field("id, gender as sex")->select();
    $user = Db::name("user")->field(["id", "gender"=>"sex"])->select();
    
  • fieldRaw() 方法里,可以直接给字段设置 MySQL 函数;

    // 直接SQL函数
    $user = Db::name("user")->fieldRaw("id, UPPER(details)")->select();
    $user = Db::name("user")->field(true)->select();   // 推荐
    return Db::getLastSql();
    
  • 使用 withoutField() 方法中字段排除,可以屏蔽掉想要不显示的字段;

    // 排除字段
    $user = Db::name("user")->withoutField("details")->select();
    
  • 使用 field() 方法在新增时,验证字段的合法性;

    // 排除新增字段
    Db::name("user")->field("name,age,gender")->insert($data);
    

3. 常用链式方法(不讲)

  • 使用 alias() 方法,给数据库起一个别名;

    // 给数据库起个别名
    Db::name("user")->alias("a")->select();
    return Db::getLastSql();
    
    // 起别名最主要是和另一张表进行关联,这里看手册好了,没表测试
    alias("a")->join()
    
  • 使用 limit() 方法,限制获取输出数据的个数;

    // 显示前5条
    $user = Db::name("user")->limit(5)->select();
    
  • 分页模式,即传递两个参数,比如从第 3 条开始显示 5 条 limit(2,5);

    // 从第2个位置,也就是第3条开始,显示5条
    $user = Db::name("user")->limit(2,5)->select();
    // 查询第一页数据,1至10条
    $user = Db::name("user")->page(1,10)->select(); 
    
  • 使用 order() 方法,可以指定排序方式,没有指定第二参数,默认 asc;

    // 按id倒序排列
    $user = Db::name("user")->order("id", "desc")->select();
    
  • 支持数组的方式,对多个字段进行排序;

    // 按多个字段规则排序
    $user = Db::name("user")->order(["age"=>"asc", "id"=>"desc"])->select();
    //支持 orderRaw() 方法,可以传入SQL函数,和前面各类Raw一样,不再赘述
    
  • 使用 group() 方法,给性别不同的人进行 age 字段的总和统计;

    // 统计性别的年龄总和
    $user = Db::name("user")->fieldRaw("gender, SUM(age)")
                            ->group("gender")->select();
    
  • 使用 group() 分组之后,再使用 having() 进行筛选;

    // 统计性别的年龄总和,筛选大于100的
    $user = Db::name("user"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2035981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app总结

1. <u-form-item label"报废人" ><u--input v-model"model.remark" border"bottom" placeholder"请输入"></u--input> </u-form-item> border"bottom" 报废日期 为了

【海贼王航海日志:前端技术探索】一篇文章带你走进JavaScript(一)

目录 1 -> 初识JavaScript 1.1 -> JavaScript是什么 1.2 -> 发展历史 1.3 -> JavaScript和HTML和CSS之间的关系 1.4 -> JavaScript运行过程 1.5 -> JavaScript的组成 2 -> 前置知识 2.1 -> JavaScript的书写形式 2.2 -> 注释 2.3 -> 输…

Stable Diffusion-inpaint(mask补全)是怎么做的?

AIGC专栏4——Stable Diffusion原理解析-inpaint修复图片为例_diffusion inpaint-CSDN博客 如果我们必须训练一个inpaint模型才能对当前的模型进行inpaint&#xff0c;那就太麻烦了&#xff0c;有没有什么方法可以不需要训练就能inpaint呢&#xff1f; Stable Diffusion就是一…

Unity新输入系统 之 InputAction(输入配置文件最基本的单位)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的构成结构&#xff1a;Unity新输入系统结构概览-CSDN博客 Input System - Unity 手册 1.In…

创客匠人媛姐:做得一切都是为了拿到结果!

大家好&#xff0c;我是媛姐。近期我做了《百场IP发售销讲实战宣讲-发售教练点评》的直播活动。邀请了艺得世界人才创造社白钰玮老师为大家现场演练一场销讲&#xff0c;展示发售销讲私教班的培训成果。结果证明&#xff0c;白老师完成得非常出色。 以下&#xff0c;我将分享一…

WPF APP生命周期和全局异常捕获

应用启动事件与启动参数 属性查找 选择想要控件的事件&#xff0c;可以在控件上鼠标右击选择属性&#xff0c;在右上角点击闪电符号即可看到这个控件的所有事件&#xff1a; APP.Run()启动方法&#xff1a; 打开项目中这个文件&#xff1a; ".....\XH.EventLesson\obj…

Chapter 9 Operational Amplifiers

Chapter 9 Operational Amplifiers operational amplifier (op-amp) 运算放大器无疑是模拟电路中最基础最重要的block之一. 这一章我们首先review telescopic and folded-cascode 拓扑, 然后学习two-stage and gain-boosting 结构, 和共模反馈问题, 最后引入slew rate, 分析su…

基于Python、Django开发Web计算器

1、创建项目 创建Django项目参照https://blog.csdn.net/qq_42148307/article/details/140798249&#xff0c;其中项目名为compute&#xff0c;并在该项目下创建一个名为app的应用&#xff0c;并且进行基本的配置。 2、导入Bootstrap前端框架 Bootstrap的使用参照https://blo…

【项目分享】使用python的ttkbootstrap模块构建一个炫酷的计时器

目录 前言 项目背景 项目展示(图片) 项目实现 1. 安装与设置 2. 创建主窗口 3. 初始化计时器功能 4. 实现计时功能 5. 实现隐藏边框与置顶功能 6. 运行应用 完整代码 结论 🌟 嗨,我是命运之光! 🌍 2024,每日百字,记录时光,感谢有你一路同行。 🚀 携…

TCP详解(二)滑动窗口/流量控制

本文解释了TCP为何能保证数据传输的可靠性&#xff0c;以及如何保证整个网络的顺畅。 1 网络分层模型 这是一切的本质。网络被设计成分层的&#xff0c;所以网络的操作就可以称作一个“栈”&#xff0c;这就是网络协议栈的名称的由来。在具体的操作上&#xff0c;数据包最终形…

tcpdump入门——抓取三次握手数据包

1. 使用docker启动一个tcp应用 参考&#xff1a;https://blog.csdn.net/LONG_Yi_1994/article/details/141175526 2. 获取容器id docker ps |grep gochat 3. 获取容器的 PID 首先&#xff0c;你需要获得容器的进程 ID&#xff08;PID&#xff09;。可以使用 docker inspect…

kafka下载|安装

1、下载kafka https://kafka.apache.org/downloads 2、安装kafka 解压下载的kafka安装包即可 tar -xvf kafka_2.13-3.7.0.tgz -C /usr/local/3、查看kafka目录 bin目录&#xff1a;存放了脚本 config目录&#xff1a;主要存放了配置文件

Pytest-BDD流程性接口测试和自定义测试报告

引言 上篇文章《Pytest-BDD实现接口自动化测试&#xff0c;并附全部代码》我们介绍了怎么使用Pytest-BDD实现接口自动化测试&#xff0c;本篇文章主要介绍怎么去做流程性接口测试和自定义测试报告相关内容。 流程性接口测试 流程性接口测试&#xff0c;指的是一个业务流需要…

【九芯电子】智能声控台灯语音模块,低成本语音识别芯片

在当今数字化时代&#xff0c;智能家居已经逐渐成为现代生活中的一部分。从温度调节到安全监控&#xff0c;我们对家居设备的控制已经更加便捷。然而&#xff0c;随着生活节奏的加快&#xff0c;用户对于更便捷的家庭控制方式的需求也在不断增加。针对这一关键的问题&#xff0…

HBO引爆血腥浪漫,尺度全开必看的影视剧推荐

一直以来我们的僵尸题材电影风靡全国&#xff0c;同时西方也创作出吸血鬼题材、丧尸题材的影视剧也是层出不穷&#xff0c;那今天我们就来探讨下吸血鬼题材的影视剧。 吸血鬼题材的影视剧&#xff0c;一直以来都是观众的宠儿。从光鲜亮丽的《暮光之城》到狗血多角恋的《吸血鬼日…

河北移动:核心系统数据库成功完成整体迁移 ,实现全栈国产|OceanBase案例

本文作者&#xff1a;移动通信集团河北有限公司架构规划专家&#xff0c;房瑞 项目背景&#xff1a; 中国移动通信集团河北有限公司一直在积极响应国家及集团的号召&#xff0c;以磐舟&磐基云原生为底座&#xff0c;结合国产浏览器、中间件、数据库、操作系统和服务器等&a…

树莓派4b无法选择声音输入输出设备问题

问题一&#xff1a;选择不了3.5mm音频输出口&#xff0c;也看不到音频输入设备 运行命令 &#xff1a;pactl load-module module-udev-detect tsched0 pactl load-module 命令用于在运行时加载新的模块。module-udev-detect 是PulseAudio的一个模块&#xff0c;它负责自动检测系…

【kubernetes】k8s对外服务之Ingress

一、Ingress介绍 1、Ingress的简介 K8S集群外部的客户端访问K8S集群内部的方案 基于Service实现&#xff1a;NodePort、LoadBalancer、externalIPs 只能支持四层代理转发&#xff0c;如果K8S集群规模较大运行的业务服务较多&#xff0c;NodePort端口/externalIPs管理成本…

Python套接字综合应用(UDP篇)

Python套接字综合应用(UDP篇) 1、 主要功能 UDP客户端实现UDP服务端实现输出字体颜色控制响应捕获键盘CtrlC信号套接字异常捕获及处理通信报文16进制格式化输出 2、 Python UDP套接字应用 Windows程序在WinServer2022上验证运行&#xff0c;Linux程序在银河麒麟V10上验证运…

[Java]面向对象-抽象类/方法接口适配器设计模式

抽象类 一个类中如果存在抽象方法&#xff0c;那么该类就必须申明为抽象类 定义格式&#xff1a; 如果一个类包含抽象方法&#xff0c;那么该类必须是抽象类。注意&#xff1a;抽象类不一定有抽象方法&#xff0c;但是有抽象方法的类必须定义成抽象类。 abstract class 类名…