Laravel支持原生SQL查询、fluentquerybuilder和EloquentORM三种查询方式:fluentquerybuilder(简称DB),是一个创建和运行数据库查询的工具接口支持大部分数据库操作,其实质和手写SQL是一样的。EloquentORM(简称ORM)是一个对象关系映射器(ObjectRelationalMapper)工具。通过建立模型并与数据表进行交互,它将数据库中的数据映射为对象和集合对象。无需触及底层数据即可直接调用。映射的对象被开发。本篇笔记主要是整理一下常用的ORM操作。Queryartisantinker是Laravel框架自带的命令。用于调出Laravel的交互运行时,EloquentORM的代码可以直接在这个环境中运行。查询列表获取所有数据:使用App\Models\User;$users=User::all();如果只需要部分字段,有两种方式限制:$users=User::all(["id","name"]);$users=User::select("id","name")->get();获取单个列:$name=User::pluck('name');//["boo","mac","yumi"]也可以指定返回集合中字段的自定义键名。注意:自定义key必须是表中其他字段的列名,否则会报错:$name=User::pluck('email','name');//["boo"=>"boo@example.com","yumi"=>"yumi@example.com"]查询单条数据//通过主键获取模型$user=User:;find(1);//获取第一个符合查询条件的模型$user=User::where('is_enable',1)->first();//获取第一条数据的指定列Value$user=User::value("name");//返回结果为字符串:boo//传入主键数组调用find方法,返回匹配的记录集$user=User::find([1,2,3]);//等价于$user=User::whereIn("id",[1,2,3])->get();处理返回结果集EloquentORM查询返回值是Illuminate\Database\EloquentCollection的一个实例,所以除了使用传统的数组方式进行遍历外,还可以使用集合方式进行遍历。chunkchunk方法可以将一个大的结果集分成小的查询块。例如,我们可以将所有User表数据切割成一个小块,一次处理5条记录:$result=User::chunk(5,function($users){foreach($usersas$user){echo$user->name.PHP_EOL;}});//resultisbooleanUser表中有14条数据,通过查看查询日志可以看到chunk分为三个查询:each如果你想要在不修改集合本身的情况下对集合中的每个项目执行一些操作,您可以使用each:$users=User::all();$users=$users->each(function($user,$key){$user->password=bcrypt(122410);});//返回结果包含一个完整的User模型,其中修改了password字段的值map如果要遍历集合中的所有元素,做他们修改和返回一个包含修改的新集合,然后你需要使用地图:$users=User::all();$users=$users->map(function($user,$key){return["name"=>$user->name,"password"=>bcrypt(122410),];});//返回结果只包含name和password字段,其中修改password字段的值聚合方式//统计总数$count=User::count();//统计分组$count=User::groupBy("is_enable")->selectRaw("count(id)asaggregate")->get();//注意不要这样写:User::select('count(id)asaggregate')->groupBy("is_enable")->get();条件查询构建复杂查询://组合查询方法一$where=[];$哪里[]=["is_enable",1];$where[]=[function($query){$query->where("id",">",10)->orWhere("name","like","%admin%");}];User::select("id","nameasusername","email")->where($where)->get();//组合查询方式2$builder=User::select("id","nameasusername","email");$builder->where("is_enable",1);$builder->where(函数($query){$query->where("id",">",10)->orWhere("name","like","%admin%");});$users=$builder->get();//两种方法的查询SQL与:选择`id`、`name`作为`username`、`email`来自`users`where(`is_enable`='1'and(`id`>'10'or`name`like'%admin%'))//WhereExists$builder=User::select("id","name","email");$builder->whereExists(function($query){$query->select(User::raw(1))->from("topics")->whereRaw("topics.user_id=users.id");});//查询发表文章的用户排名//用户id倒序$user=User::orderBy("id","desc")->get();//获取created_at最大的记录$user=User::latest()->first();//获取created_at最小记录$user=User::oldest()->first();//随机记录$users=User::inRandomOrder()->first();limit//跳过前两条记录,取三条记录$users=User::skip(2)->take(3)->get();//输出SQL:select*from`users`limit3offset2//同上$users=User::offset(2)->limit(3)->get();other//使用别名$user=User::select("nameasusername","id")->first();//创建查询构建$builder=User::select("name");//在现有的select子句中添加一个查询列$user=$builder->addSelect("id")->first();Pagination$users=User::paginate(10);$users=User::simplePaginate(10);paginate方法,返回Illuminate\Pagination\LengthAwarePaginator实例simplePaginate方法,返回Illuminate\Pagination\Paginator实例每个pager实例可以由以下方法更多分页信息:$result->count()//当前页码$result->currentPage()//当前页码$result->perPage()//每页多少条$result->total()//总计(使用simplePaginate时无效)$result->hasMorePages()//是否还有更多$result->firstItem()$result->lastItem()$result->lastPage()(使用simplePaginateate)$result->nextPageUrl()$result->previousPageUrl()$result->url($page)插入一个条目:$user=newUser();$user->name="yumi";$user->fill(["email"=>"yumi@example.com"]);$user->save();//返回模型对象$user=newUser(["name"=>"boo",'email'=>'boo@example.com']);$user->save();$result=User::create(["name"=>"boo",'email'=>'boo@example.com']);//返回模型对象//单次插入,返回对应ID$result=User::insertGetId(["name"=>"boo",'email'=>'boo@example.com']);//返回插入记录对应的ID批量插入:$result=User::insert([["name"=>"boo",'email'=>'boo@example.com']["name"=>"yumi",'email'=>'yumi@example.com']]);//返回布尔值注意??:此时不会触发saving和savedmodel事件更新单次update$user=User::find(1);$user->name='yumi';$user->save();//返回布尔值$user=User::find(1);$user->update($data);//返回受影响的行数$user=User::where("id",1)->update(['password'=>bcrypt(122410)]);//返回受影响的行数批量更新:$user=User::whereIn("id",[1,2,3])->更新吃(['密码'=>bcrypt(122410)]);//返回受影响的行数删除单个delete//通过主键查询,删除模型$user=User::find(1);$user->delete();//返回Boolean//直接删除通过主键User::destroy(1);//返回受影响的行数User::where('id',1)->delete();批量删除:User::destroy([1,2,3]);User::destroy(1,2,3);//注意:通过Eloquent批量删除时,不会触发删除和删除事件,因为删除模型时不会触发它们获取模型User::whereIn('id',[1,2,3])->delete();//两者都返回受影响的行数。软删除除了实际删除数据库记录外,Eloquent还可以“软删除”模型。软删除模型实际上并未从数据库中删除。事实上,deleted_at属性是在模型上设置的,它的值被写入数据库。如果deleted_at值不为空,则表示模型已被软删除。如果要开启模型的软删除功能,需要做三件事:在数据库中添加deleted_at字段,在模型上导入Illuminate\Database\Eloquent\SoftDeletes特性,在$$中添加deleted_at列日期属性trashed()){//}//包括软删除模型$users=User::withTrashed()->get();//只检索软删除模型$users=User::onlyTrashed()->get();//永久删除$user->forceDelete();注意??:通过Eloquent批量删除时,deleting和deleted事件不会触发,因为在做模型删除的时候没有取到模型。当通过Eloquent进行批量更新时,不会为更新后的模型触发保存、保存、更新和更新模型事件。这是因为在批处理更新时从未真正检索到模型。参考链接EloquentQuickStartLaravel中EloquentORM相关操作
