laravel 随笔小结
1、控制器try-catch包容样式,基本结构默认书写,验证+验证失败+代码实现,catch抛出异常:Log::error('快递公司[编辑]失败|执行时间:' . Carbon::now()->toDateTimeString() . "|错误文件:" . $e->getFile() . "|错误行号:" . $e->getLine() . "|错误原因:" . $e->getMessage());
2、路由设置和控制器名结和,不显示id数据,所用id以参数方式前端提交;
3、默认索引添加,关联字段,where查询字段,默认可以以created_at以及各种关联ID为主,日期以默认三个月为前提:
# 日期
if (request('start_time') && request('end_time')) {
$startTime = Carbon::parse(request('start_time'))->startOfDay()->toDateTimeString();
$endTime = Carbon::parse(request('end_time'))->endOfDay()->toDateTimeString();
$query->whereBetween('business_orders.meet_begin_at', [$startTime, $endTime]);
}
# 默认最近三个月
$query->whereBetween('business_orders.created_at', [Carbon::now()->firstOfMonth()->subMonth(3)->toDateTimeString(), Carbon::now()->endOfDay()->toDateTimeString()]);
4、路由规定名称,以订单为例,不同种类订单定义不同路由name,对应控制器$request->route()->getName()查询路由别名,分类查询数据显示;
5、控制器多字段搜索:
if (request('search_universal') && request('search_type')) {
switch (request('search_type')) {
case "out_business_order_number":
$query->whereIn('business_orders.out_business_order_number', array_filter(explode('&',preg_replace("/(,|,|\s)/",'&',request('search_universal')))));
break;
6、数据库查询,关联主表id使用leftJoin关联查询,多表关联使用join+关联ID;
7、模型定义数据库属性名查询,eg:whereOrderStatus(OrderStatus::CREATED),默认使用,不用定义;
8、whereColumn
方法用于比较两个字段的值 是否相等:也可以传入一个比较运算符和and运算符链接;
9、group_concat()的用法(整合group by及order by):
功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
concat()函数用法(数据库查询地址栏常用):
功能:将多个字符串连接成一个字符串。
语法:concat(str1, str2,...)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
10、leftjoin高级查询应用——传递一个闭包
作为join
方法的第二个参数。此闭包
接收一个JoinClause
对象,从而指定join
语句中指定的约束:
DB::table('users')->join('contacts', function ($join){
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.user_id', '>', 5);
})->get();
11、查询构造器悲观锁使用,若想在查询中实现一个「共享锁」,可以使用sharedLock
方法。 共享锁可防止选中的数据列被篡改,直到事务被提交为止 :DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
或者,你可以使用lockForUpdate
方法。使用 「update」锁可避免行被其它共享锁修改或选取:DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
eg:
$expressOrder = ExpressOrder::query()->where('express_order_number', $expressOrderNumber)->lockForUpdate()->first();