构造器
Posted simadongyang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造器相关的知识,希望对你有一定的参考价值。
分块结果
如果你需要处理上千条数据库记录,你可以考虑使用chunk方法,该方法一次获取结果集的一小块,并将其
传递给闭包,函数进行处理,该方法在artisan命令编写千条处理数据的时候非常有用,例如,我们可以将全部users
表数据切割成一次处理100条记录的一小块
DB::table(‘users‘)->orderBy(‘id‘)->chunk(100,function($users){
foreach($users as $user){}
});
你可以通过 闭包 中返回false来终止继续获取分块结果
DB::table(‘users‘)->orderBy(‘id‘)->chunk(100,function($users){
return false;
});
聚合
查询构造器还提供了各种聚合方法,比如 count max min avg 还有sum ,你可以在构造查询后调用任何方法
$users = DB::table(‘users‘)->count();
$price = DB::table(‘orders‘)->max(‘price‘);
你可以将这些聚合方法与其他的查询语句相结合
$prive = DB::table(‘orders‘)->where(‘fin‘,1)->avg(‘price‘);
判断记录是否存在
除了通过 count 方法可以确定查询条件的结果是否存在之外,还可以使用exists和 doestExist方法
return DB::table(‘orders‘)->where(‘f‘,1)->esists();
return DB::table(‘orders‘)->where(‘f‘,1)->doesntExist();
selects 指定一个 select 语句
当然你可能并不总是希望从数据库表中获取所有列,使用 select方法,你可以自定义一个select查询语句来查询指定
的字段
$users = DB::table(‘users‘)->select(‘name‘,‘email as user_email‘)->get();
distinct 方法会强制让查询返回的结果不重复
$users = DB::table(‘users‘)->distinct()->get();
如果你已经有了一个查询构造器实例,并且希望在现有的查询语句中加入一个字段,那么你可以使用 addSelect方法:
$query = DB::table(‘users‘)->select(‘name‘);
$users = $query->addSelect(‘age‘)->get();
原生表达式
有时候你可能需要在查询中使用原生表达式。你可以使用 DB::raw创建一个原生表达式
$users = DB::table(‘users‘)
->select(DB::raw(‘count(*) as user_count,status‘))
->where(‘status‘,‘<>‘,1)
->groupBy(‘status‘)
->get();
可以使用以下方法代替DB::raw 将原生表达式插入查询的各个部分
selectRaw 方法可以代替 select(DB::raw(...)) .该方法的第二参数是可选项,值是一个绑定参数的数组
$orders = DB::table(‘orders‘)->selectRaw(‘price * ? as price_with_tax‘,[1.2222])->get();
whereRaw orWhereRaw havingRaw orHavingRaw
joins
查询构造器也可以编写 join方法,若要执行基本的 内连接,你可以在查询构造器实例上使用 join方法,传递给join方法的
第一个参数是你需要连接的表的民称,而其他参数则使用指定连接的字段约束。你还可以在单个查询中连接多个数据库、
$users = DB::table(‘users‘)
->join(‘contacts‘,‘users.id‘,‘=‘,‘contacts.user_id‘)
->join(‘orders‘,‘users.id‘,‘=‘,‘orders.user_id‘)
->select(‘users.*‘,‘contacts.phone‘,‘orders.price‘)
->get();
left join 语句
如果你想使用 做链接代替内连接,可以使用leftJoin方法,leftJoin方法与join方法用法相同
$users = DB::table(‘users‘)->leftJoin(‘posts‘,‘users.id‘,‘=‘,‘posts.user_id‘)->get();
高级join语句
你可以指定更高级的join语句。比如传递一个闭包作为join方法的第二个参数,此闭包接收一个joinclause 对象
从而指定join语句中指定的约束
DB::table(‘users‘)->join(‘contains‘,function($join){
$join->on(‘users.id‘,‘=‘,‘contacts.user_id‘)->orOn(...);
})
->get();
如果你想要在连接上使用where风格的语句,你可以在链接上使用where和orwhere方法,这些方法会将列和值进行
比较,而不是列和列进行比较
DB::table(‘users‘)->join(‘contains‘,function($join){
$join->on(‘users.id‘,‘=‘,‘contacts.user_id‘)
})
->get();
子链接查询
你可以使用 joinSub leftJoinSub 和 rightJoinSub 方法关联一个查询作为子查询,他们每一种方法都会接收三个参数
子查询 表别名和定义关联字段的闭包
$latestPosts = DB::table(‘posts‘)
->select(‘user_id‘,DB::raw(‘MAX(create_at) as last_post_created_at‘))
->where(‘is_published‘,true)
->groupBy(‘user_id‘);
$users = DB::table(‘users‘)
->joinSub($latestPosts,‘latest_posts‘,function($join){
$join->on(‘users.id‘,‘=‘,‘latest_posts.user_id‘);
})->get();
Unions 查询构造器还提供了将两个查询联合的快捷方式,比如,你可以先创建一个查询,然后使用union 方法
将其他和第二个查询进行联合
$first = DB::table(‘users‘)
->whereNull(‘first_name‘);
$users = DB::table(‘users‘)
->whereNull(‘last_name‘)
->union($first)
->get();
Where 语句
简单的where语句
在构造where查询实例中,可以使用where方法,调用where最基本的方式是需要传递单个参数:第一个参数是列名
第二个参数是任意一个数据库系统支持的运算符,第三个是该列要比较的值。
例如 下面是一个要验证 votes 字段的值等于 100的查询
$users = DB::table(‘users‘)->where(‘votes‘,‘=‘,100)->get();
为了方便,如果你知识简单比较列值和给定数值是否相等,可以将数值直接作为 where方法的第二个参数
$users = DB::table(‘users‘)->where(‘votes‘,100)->get();
当然,你也可以使用其他的运算符来编写 where字句
$users = DB::table(‘users‘)->where(‘votes‘,‘>=‘,100)->get();
你还可以传递条件数组到where函数中
$users = DB::table(‘users‘)->where([
[‘status‘,‘=‘,‘1‘],
[‘sub‘,‘<>‘,‘1‘]
])->get();
Or语句
你可以一起链式调用where约束,也可以在查询中添加or字句,orWhere方法和where方法接收的参数一样
$users = DB::table(‘users‘)->where(‘votes‘,‘>‘,100)->orWhere(‘name‘,‘John‘)->get();
其他where语句
whereBetween 方法验证字段值是否在给定的两个值之间
$users = DB::table(‘users‘)->whereBetween(‘votes‘,[1,100])->get();
whereNotBetween 方法验证字段值是否在给定的两个值之外
$users = DB::table(‘users‘)->whereNotBetween(‘votes‘,[1,100])->get();
whereIn whereNotIn
whereNull whereNotNull
whereDate whereMonth whereDay whereYear whereTime
whereColumn 方法用于比较两个字段的值是否相等
$users = DB::table(‘users‘)->whereColumn(‘first_name‘,‘last_name‘)->get();
也可以传入一个比较运算符
$users = DB::table(‘users‘)->whereColumn(‘update_at‘,‘>‘,‘create_at‘)
->get();
orderBy
方法允许你通过给定字段对结果集进行排序,orderBy的第一个参数应该是你希望排序的字段,第二个参数控制排序的方向,可以是 asc 或
desc
$users = DB::table(‘users‘)->orderBy(‘name‘,‘desc‘)->get();
latest/oldest 方法可以使你轻松的通过日期排序,它默认使用 create_at 列作为排序依据。当然,你也可以传递
自定义的列名
$user = DB::table(‘users‘)->latest()->first();
inRandomOrder 方法被用来将结果随机排序。例如,你可以使用此方法随机找到一个用户。
$randomUser = DB::table(‘users‘)
->inRandomOrder()
->first();
groupBy 和 having方法可以将结果分组。having方法的使用过与where方法十分相似
$users = DB::table(‘users‘)->groupBy(‘account_id‘)->having(‘account_id‘,‘>‘,100)->get();
skip take 跳过指定数量的结果或限制结果的返回数量
$users = DB::table(‘users‘)->skip(10)->take(5)->get();
或者你也可以使用 limit 和offset方法
$users = DB::table(‘users‘)->offset(10)->limit(5)->get();
条件语句
有时候你可能想要字句只适用于某个情况为真时才执行查询,
$role = $request->input(‘role‘);
$users = DB::table(‘userts‘)
->where($role,function($quest,$role){
return $quest->where(‘role_id‘,$role)
})
->get();
when方法只有在第一个参数为true的时候才执行给的闭包。如果第一个参数为false,那么这个闭包将不会被执行
你可以传递两一个闭包作为when方法的第三个参数。该闭包会在第一个参数为false的情况下执行。为了说明如何使用这个特性
,我们来配置一个查询的默认排序;
$sortBy = null;
$users = DB::table(‘userts‘)->when($sortBy,function($query,$sortBy){
return $query->orderBy($sortBy);
},function($query){
return $query->orderBy(‘name‘);
})
->get();
插入 查询构造器还提供了insert 方法用于插入记录到数据库中,insert方法接收数组形式的字段名和字段值进行插入
操作:
DB::table(‘users‘)->insert([‘email‘=>‘[email protected]‘,‘votes‘=>0]);
将多个记录插入到表中
DB::table(‘users‘)->insert([
[],
[]
]);
自增ID
如果数据表有自增ID,使用insertGetId,方法来插入记录并返回ID值
$id = DB::table(‘users‘)->insertGetId(
[‘email‘=>‘[email protected]‘,‘votes‘=>0]
);
更新 update
DB::table(‘users‘)->where(‘id‘,1)->update([‘votes‘=>1]);
自增与自减
->increment(‘votes‘)
->increment(‘votes‘,5)
->decrement(‘votes‘)
也可以在操作过程中指定要更新的字段
->increment(‘votes‘,1[‘name‘=>‘john‘])
删除 delete
->delete()
清空表 truncate()
sharedLock()
lockForUpdate()
以上是关于构造器的主要内容,如果未能解决你的问题,请参考以下文章