10 数据库配置入门

文件路径 config/database.php:46

  1. 'mysql' => [
  2. 'driver' => 'mysql',
  3. 'url' => env('DATABASE_URL'),
  4. 'host' => env('DB_HOST', '127.0.0.1'),
  5. 'port' => env('DB_PORT', '3306'),
  6. 'database' => env('DB_DATABASE', 'forge'),
  7. 'username' => env('DB_USERNAME', 'forge'),
  8. 'password' => env('DB_PASSWORD', ''),
  9. 'unix_socket' => env('DB_SOCKET', ''),
  10. 'charset' => 'utf8mb4',
  11. 'collation' => 'utf8mb4_unicode_ci',
  12. 'prefix' => '', // 数据表前缀
  13. 'prefix_indexes' => true,
  14. 'strict' => true,
  15. 'engine' => null,
  16. 'options' => extension_loaded('pdo_mysql') ? array_filter([
  17. PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
  18. ]) : [],
  19. ],

模型的编码规范要求数据表为负数形式, 可能会加es, 可能会加ies, 也可能是child变成children等等等
这里可以通过Str::plural()来知晓英文单词的复数的情况
image.png

11 构造器的查询, 分块, 聚合(未完全掌握)

pluck(字段名) 可以获取所有的数据单列表的集合

  1. Navigation::pluck('link', 'title'),
  2. DB::table('navigations')->pluck('link', 'title')

分块

如果需要处理如4w样的大数据时, 为防止出错可以使用chunk()方法

$filepath = fopen(public_path().'/sql.csv','w');
fputcsv($filepath,['', '字段名', '', '字段类型', '', '备注']);
Navigation::chunk(1000, function ($data) use ($filepath) {
  foreach ($data as $item) {
    fputcsv($filepath,['', $item->column_name, '', $item->column_type, '', $item->column_comment]);

  }
  fclose($filepath);

})->orderBy('table_name');

聚合

DB::table('users')->count() // 统计
DB::table('users')->avg('age') // 平均数
DB::table('users')->where('id', 10000)->exits() // 判断是否有记录
DB::table('users')->where('id', 10000)->doesntExits() // 判断是否无记录

12 构造器的表达式

在原有的基础上新增一个查询构造器

$order = DB::table('orders')->select('id', 'product_id');
$order = $order->addSelect('order_sn')->get();

直接将所有的方法都变成一个完成表达式来做查询

$order = DB::table('orders')->selectRaw('count(*) as count, type')->orderBy('type')->get();

having 分组后再做一次筛选

$order = DB::table('orders')
  ->selectRaw('count(*) as count, type')
  ->orderBy('type')
  ->havingRow('type == 1')
  ->get();

13 构造器的where派生查询

whereBetween( ) 可以实现区间查询

$order = DB::table('orders')
  ->whereBetween('created_at', ['2021-01-01', '2021-06-01'])
  ->get();

whereDate( ) 可以查询指定日期的记录

$order = DB::table('orders')->whereDate('created_at', '>', '2021-01-01')->get();
$order = DB::table('orders')->whereYear('created_at', '>', 2021)->get();
// PS:这里还支持相关四种: whereYear /whereMonth/whereDay/whereTime,支持or前缀;

14 构造器的排序分组, 子查询(未完全掌握)

排序

whereColumn( ) 可以实现两个字段相比较的查询结果

$order = DB::table('orders')->whereColumn('updated_at', '>', 'pay_time')->get();

latest() 设置时间倒叙来排 默认时间字段为created_at

$order = DB::table('orders')->latest('pay_time')->get();

inRandomOrder() 通过一个随机方法进行排序, 得到一个随机列表

$order = DB::table('orders')->inRandomOrder()->get();

分组

when() 设置条件选择, 参数$value, $function1, $function2, 若$value为真执行$function1, 否则执行$function2

$order = Orders::when($type = 1, function ($query, $value) {
  // 这里的$value的值为前面传的$type的值
  dump($query);
}, function ($query, $value) {
  // 这里的$value的值为前面传的$type的值
})->get()->toArray();

【mysql 5.7的新特性(json)】
查询json中的数据

$order = Orders::where('response->openid', $openid)->get()->toArray();

子查询

$order = RecruitType::whereExists(function($query) {
  // $query->from('recruit')->whereRaw('recruit.type', 'recruit_type.id');
  $query->selectRaw(1)->from('recruit')
    ->whereColnmn('recruit.type', 'recruit_type.id');
})->toSql();

// PS: select 1 from, -般用子子查询的手段,口的是减少开销,提升效率


$order = RecruitType::where('id', function($query) {
  $query->select('job')->from('recruit')
    ->whereColnmn('recruit.type', 'recruit_type.id');
})->toSql();


/*  
   select * from `recruit_type` 
    where exists (
      select * from `recruit` where recruit.job = recruit_type.id
    )
*/

15 构造器的join查询(未完全掌握)

dustinct( )取消重复数据

子查询

子表查询后的结果做一个连表查询

$query = DB::tab1e(table: 'books' )->selectRaw('user_id, tit1e');
$users = DB::table(table; 'users' )
  ->joinSub($query,as: 'books' , function () {
      $join->on('books.user_id', '=', 'users.id');
  }))->to5ql();


/*

select * from users 
   inner join (select user.id, title from books ) as books
         on books.user_id = users.id
*/

合并查询

$query = DB::table('seckill_orders')->select('order_sn');
$orders = DB::table('orders')->select('order_sn')
->union($query)
->get();


$query = DB::table('seckill_orders')->select('order_sn');
$orders = DB::table('orders')->select('order_sn')
->unionAll($query)
->get();

16 构造器的增删改

增删改操作

insertOrIgnore( ) , 可以忽略错误, 返回成功插入数量

        dd(Navigation::insertOrIgnore([
            [
                'id' => 1,
                'title' => 'asdads',
                'slug' => 'asdads',
                'order' => '100',
                'enable' => 1,
            ],
            [
                'id' => 1,
                'title' => 'asdads',
                'slug' => 'asdads',
                'order' => '100',
                'enable' => 1,
            ],
            [
                'id' => 1,
                'title' => 'asdads',
                'slug' => 'asdads',
                'order' => '100',
                'enable' => 1,
            ],
        ]));

// 返回 1

修改数据表中的json类型的字段

DB::table('article')->where('id', 1)->update([
    'tdk->TITLE' => '文章标题'
])

increment( )自增, decrement( ) 自减

DB::table('article')->where('id', 1)->increment('visited');
// article表中的visited字段自增1 
DB::table('article')->where('id', 1)->increment('visited', 3);
// article表中的visited字段自增3

DB::table('article')->where('id', 1)->decrement('visited');
// article表中的visited字段自减1 
DB::table('article')->where('id', 1)->decrement('visited', 3);
// article表中的visited字段自减3

清空表数据

DB::table('users')->delete();
DB::table('users')->truncate();