操作
获取(查询)
获取集合,(查询列表)
返回值是 IlluminateDatabaseEloquentCollection 的一个实例
获取所有的数据
use App\User;$users = User::all();
条件获取列表
$users = User::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get();
获取数据列值
$result = User::where('gender', '1')->pluck('name'); // 返回 ['name1','name2 ']// 该自定义键必须是该表的其它字段列名,否则会报错$result = User::where('gender', '1')->pluck('email','name');// 返回 {"name1":"该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。","name2":"该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。"}
获取单个模型,(查询单条数据)
// 通过主键获取模型$user = User::find(1);// 获取匹配查询条件的第一个模型...$user = User::where('active', 1)->first();// 返回第一个gender为1的用户的名字$name = User::where('gender', '1')->value('name');// 传递主键数组来调用 find 方法,这将会返回匹配记录集合:$users = App\Flight::find([1, 2, 3]);如果没有任何查询结果,IlluminateDatabaseEloquentModelNotFoundException 异常将会被抛出:$model = App\Flight::findOrFail(1);$model = App\Flight::where('legs', '>', 100)->firstOrFail();
处理结果集
$result = User::where('gender', '1')->chunk(5, function($users) { foreach ($users as $user) { $name = $user->name; echo $name; }}) // 输出名字// result 为 boolean $result = User::where('gender', '1')->chunk(5, function($users) { foreach ($users as $user) { $name = $user->name; if ($name == "dxx5") { echo $name; return false; } }}) // 找出某个名字
聚合方法
// 获取总数$count = Flight::where('active', 1)->count();// 获取最大值$max = Flight::where('active', 1)->max('price');//平均值$max = Flight::where('active', 1)->avg('price');
条件查询
select查询
// 查询名字和email $users = User::select('name','email as user_email')->get(); // 返回 [{"name":"name1","user_email":"该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。"}] // 查询构建器实例,添加一个查询列到已存在的 select 子句 $user = User::select('name'); $users = $user->addSelect('gender')->get();
联合
$first = DB::table('users') ->whereNull('first_name');$users = DB::table('users') ->whereNull('last_name') ->union($first) ->get();
注:unionAll 方法也是有效的,并且和 union 有同样的使用方式
Where子句
$users = User::where('gender', '=', 1)->get(); // 男性用户$users = User::where('gender', 1)->get(); // 同上$users = User::where('age', '>=', 10)->get(); // 10岁以上用户$users = User::where('age', '<>', 10)->get(); // 非10岁用户$users = User::where('name', 'like', 'd%')->get(); // 名字为d开头的用户$users = User::where('name', 'like', '%d%')->get(); // 名字含d的用户// 传递条件数组到 where 函数:$users = User::where([['gender', '=', '1'],['age', '>', '10']])->get(); //10岁以上的男孩// or语句$users = User::where('gender', '=', 1)->orWhere('age', '>', '10')->get();
其他where语句
// whereBetween 方法验证列值是否在给定值之间:$users = User::whereBetween('age', [1, 7])->get(); // 1-7岁的用户// whereNotBetween 方法验证列值不在给定值之间:$users = User::whereNotBetween('age', [1, 7])->get(); // 1-7岁以外的用户// whereIn 方法验证给定列的值是否在给定数组中:$users = User::whereIn('id', [1, 2, 3])->get();// whereNotIn 方法验证给定列的值不在给定数组中:$users = User::whereNotIn('id', [1, 2, 3])->get();// whereNull 方法验证给定列的值为NULL:$users = User::whereNull('updated_at')->get();// whereNotNull 方法验证给定列的值不是 NULL:$users = User::whereNotNull('updated_at')->get();// whereDate 方法用于比较字段值和日期:$users = User::whereDate('created_at', '2018-05-10')->get(); // 20180510注册的用户// whereMonth 方法用于比较字段值和一年中的指定月份:$users = User::whereMonth('created_at', '10')->get();// whereDay 方法用于比较字段值和一月中的制定天:$users = User::whereDay('created_at', '10')->get();whereYear 方法用于比较字段值和指定年:$users = User::whereYear('created_at', '2016')->get();// whereColumn 方法用于验证两个字段是否相等,也可以传递一个比较运算符到该方法:$users = User::whereColumn('first_name', 'last_name')->get();$users = User::whereColumn('updated_at', '>', 'created_at')->get(); // 还可以传递多条件数组到 whereColumn 方法,这些条件通过 and 操作符进行连接:$users = User::whereColumn([ ['first_name', '=', 'last_name'], ['updated_at', '>', 'created_at'] ])->get();
参数分组
$users = User::where('name', '=', 'xxx') ->orWhere(function ($query) { $query->where('age', '>', 5) ->where('gender', 1); }) ->get(); // xxx或大于5岁的男孩where exit$users = User::whereExists(function ($query) { $query->select(DB::raw(1)) ->from('articles') ->whereRaw('articles.user_id = users.id');})->get(); // 写过文章的用户
排序
$users = User::orderBy('age', 'desc')->get(); // 年龄倒序$user = User::latest()->first(); //crate_at 最晚的那个$user = User::oldest()->first(); //crate_at 最早的那个$users = User::inRandomOrder()->first(); // 随机用户
限定
$users = User::skip(2)->take(3)->get(); // 跳过前2个取中间3个$users = User::offset(2)->limit(3)->get(); // 同上
分组
$users = User::groupBy('name')->having('age', '>', 10)->get(); // 大于10的用户// 找到所有售价大于 $2,500 的部分, 没理解$users = User::select('department', DB::raw('SUM(price) as total_sales')) ->groupBy('department') ->havingRaw('SUM(price) > 2500') ->get();when 条件子句$sortBy = null; // 当sortBy为null,默认name排序$users = User::when($sortBy, function ($query) use ($sortBy) { return $query->orderBy($sortBy); }, function ($query) { return $query->orderBy('name'); }) ->get();
分页
$users = User::paginate(3);$users->appends(['sort' => 'name'])->links(); // 修改的是连接$users->withPath('custom/url');// 约束条件$users = User::where('id', '>', 2)->paginate(2);$users = User::where('id', '>', 2)->simplePaginate(2);return $users->toArray();
返回结果:
当调用 paginate 方法时,你将获取IlluminatePaginationLengthAwarePaginator 实例,
调用方法simplePaginate 时,将会获取 IlluminatePaginationPaginator 实例。(不需要知道结果集中数据项的总数)
{ "current_page" : 1 "data": [{"id":1,"name":"name1"},{"id":2,"name":"name2"}] "from":1 "last_page":2 "next_page_url":"http://localhost:8888/user/page?page=2" "path":"http://localhost:8888/user/page" "per_page":3 "prev_page_url":null "to":3 "total":6}
每个分页器实例都可以通过以下方法提供更多分页信息:
$results->count()$results->currentPage()$results->firstItem()$results->hasMorePages()$results->lastItem()$results->lastPage() (使用simplePaginate 时无效)$results->nextPageUrl()$results->perPage()$results->previousPageUrl()$results->total() (使用simplePaginate 时无效)$results->url($page)
插入
插入
$user = new User;$user->name = "username";$user->fill(['grade' => '2']); // 使用 fill 方法通过数组属性来填充$user->save();$row = array('name' => str_random(3),'email' => str_random(3).'@qq.com')$user = User::create($row); // 返回模型对象$id = User::insertGetId($row); // 插入记录并返回ID值$success = User::nsert([ ['email' => '该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。', 'votes' => 0], ['email' => '该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。', 'votes' => 0]]); // 插入多条
更新
单个更新
$user = User::find(1);$user->name = 'new name';$user->save();
批量更新
User::where('gender', 1)->update(['age' => 1]);
自增自减
$result = User::increment('age'); // 返回修改的行数$result = User::increment('age', 2);$result = User::decrement('age');$result = User::decrement('age', 2);$result = User::increment('age',1,['gender' => 1]); // 年龄自增1 且 性别改为1
其他创建方法
$user = User::firstOrCreate(['name' => 'Flight 10']); // 不存在则创建$user = User::firstOrNew(['name' => 'Flight 10']); // 如果不存在初始化一个新的实$user = User::updateOrCreate( ['name' => 'username', 'age' => '16'], ['grade' => 3]); // 将 16岁的username 改成3年级,没有则创建
删除
$user = User::find(1);$user->delete(); // 通过主键查询后,删除模型User::destroy(1); // 直接通过主键删除User::destroy([1, 2, 3]);User::destroy(1, 2, 3);$deletedRows = User::where('age', 0)->delete(); //查询 删除// 注:通过 Eloquent 批量删除时,deleting 和 deleted 事件不会被触发,因为在进行模型删除时不会获取模型。
软删除
当模型被软删除后,它们并没有真的从数据库删除,而是在模型上设置一个 deleted_at 属性并插入数据库,如果模型有一个非空 deleted_at 值,那么该模型已经被软删除了。
启用模型的软删除功能,可以使用模型上的IlluminateDatabaseEloquentSoftDeletes trait并添加 deleted_at 列到 $dates 属性:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\SoftDeletes;class Flight extends Model{ use SoftDeletes; // 应该被调整为日期的属性,并添加 deleted_at 列到数据表 protected $dates = ['deleted_at'];}// Laravel Schema 构建器包含一个辅助函数来创建该数据列:Schema::table('flights', function ($table) { $table->softDeletes();});
现在,当调用模型的 delete 方法时,deleted_at 列将被设置为当前日期和时间.
当查询一个使用软删除的模型时,被软删除的模型将会自动从查询结果中排除。
软删除的查询
判断给定模型实例是否被软删除,可以使用 trashed 方法:
if ($flight->trashed()) { //}// 如果你想要软删除模型出现在查询结果中,可以使用 withTrashed 方法:$flights = App\Flight::withTrashed() ->where('account_id', 1) ->get(); // withTrashed 方法也可以用于关联查询中:$flight->history()->withTrashed()->get();// onlyTrashed 方法只获取软删除模型:$flights = App\Flight::onlyTrashed() ->where('airline_id', 1) ->get(); // 恢复软删除模型,使用restore 方法:$flight->restore();// 快速恢复多个模型,同样,这也不会触发任何模型事件:App\Flight::withTrashed() ->where('airline_id', 1) ->restore(); // 也可以用于关联查询:$flight->history()->restore();// 永久删除模型,可以使用 forceDelete 方法:$flight->forceDelete(); // 强制删除单个模型实例...$flight->history()->forceDelete(); // 强制删除所有关联模型...
以上就是Laravel 中Eloquent ORM 相关操作的知识。速戳>>知识兔学习精品课!