10 数据库配置入门
文件路径 config/database.php:46
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'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' => '', // 数据表前缀
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
模型的编码规范要求数据表为负数形式, 可能会加es, 可能会加ies, 也可能是child变成children等等等
这里可以通过Str::plural()来知晓英文单词的复数的情况
11 构造器的查询, 分块, 聚合(未完全掌握)
pluck(字段名) 可以获取所有的数据单列表的集合
Navigation::pluck('link', 'title'),
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();