从零开始系列-Laravel编写api服务接口:6.数据库查询(未完待续)

简介

今天开始写点简单的内容,把开发过程中经常用到的查询列出来,想到哪里写到哪里吧。

提纲:
  1. 一般查询
  2. or 查询
  3. like 查询
  4. when 条件查询
  5. with
  6. 事务
  7. join
  8. union
  9. 开启日志
  10. 跨库查询
  11. 分页
1. 一般查询
$user = User::find(1); // 查询单个记录
$users = User::where('status', 1)->get(); // 查询多个记录
$users = User::where('status', 1)->paginate(15); // page为当前页,15 表示每页显示15条

$queryBuilder = User::query();

if (1==1){
    $queryBuilder->where('status', 0);
}
return $queryBuilder->get();

2.or 查询 加上and

$queryBuilder = User::query();
$queryBuilder->where('status', 1)->where(function($q)use($keywords){
    $q->where('name', 'like', sprintf("%%%s%%", $keywords))
    ->orWhere('mobile', 'like',sprintf("%%%s%%", $keywords));
});
$user = $queryBuilder->get();

3.like 模糊查询

$user = User::where('status', 1)
->where(function($q)user($keywords){
    $q->where('name', 'like', sprintf("%%%s%%", $keyword))
    ->orWhere('mobile', 'like', sprintf("%%%s%%", $keyword));
})->paginate(10);

4.when 条件查询

$user = User::when($status,function($q)use($status){

})->when($keyword,function($q)use($keywords){
    $q->where('name','like',sprintf("%%%s%%", $keywords));
})->get();

5.with 查询(一对多,一对一,防止n+1)

6.事务

7. join

8. union

9. 开启日志

1.在EventServiceProvider下新增

 protected $listen = [
        \Illuminate\Database\Events\QueryExecuted::class => [
            'App\Listeners\QueryListener'
        ],

    ];

2.文件目录app/Listener/QueryListener.php

public function handle(QueryExecuted $event) {
        $env = config('app.env');
        if ($env === 'local' || $env === 'test') {
            $sql = str_replace('?', "'%s'", $event->sql);
            $sql = str_replace('%Y-%m-%d', "#date#", $sql); // mysql %d 表示格式化日期,vsprintf 中 %d - 包含正负号的十进制数(负数、0、正数)
            $sql_log = vsprintf($sql, $event->bindings);
            $sql_log = str_replace('#date#', '%Y-%m-%d', $sql_log);
            $monolog = Log::getMonolog();
            $monolog->popHandler();
            Log::useDailyFiles(storage_path('logs/sql.log'));
            Log::info($sql_log.PHP_EOL);
        }
    }

或者

    public function handle(QueryExecuted $event) {
        $env = env('APP_ENV', 'production');
//        // todo 演示期间加上日志,随时查问题(正式上线去掉 || $env === 'production')
        if ($env === 'local') {
            $sql = str_replace('?', "'%s'", $event->sql);
            $sql_log = vsprintf($sql, $event->bindings);

            $log = Log::channel('sqlLog');
            $log->info($sql_log.PHP_EOL);
        }
    }

10. 跨库查询

1.添加垮库配置文件
打开config下配置文件database.php
添加跨库配置(同时env文件也同步添加响应配置):

'mysql_platform' =>[ // 跨库,连接医联体的数据库
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => env('DB_PREFIX', ''),
    'strict' => true,
    'engine' => null,
],

用法:

  1. 直接用db类 DB::connection("mysql_platform")->table('')->get();
  2. 对应表模型里面 protected $connection = 'mysql_platform';

    11. 分页

    分页就不用说了,page 当前页,per_page 每页数
    DB::table('users')->paginate($per_page);
本作品采用《CC 协议》,转载必须注明作者和本文链接
编程两年半,喜欢ctrl(唱、跳、rap、篮球)
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!