Laravel 中Eloquent ORM 相关操作

定义

操作

获取(查询)

获取集合,(查询列表)

返回值是 IlluminateDatabaseEloquentCollection 的一个实例

获取所有的数据

use AppUser; $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":"ed9@qq.com","name2":"ed89@qq.com"}

获取单个模型,(查询单条数据)

// 通过主键获取模型 $user = User::find(1); // 获取匹配查询条件的第一个模型... $user = User::where('active', 1)->first(); //  返回第一个gender为1的用户的名字 $name = User::where('gender', '1')->value('name'); // 传递主键数组来调用 find 方法,这将会返回匹配记录集合: $users = AppFlight::find([1, 2, 3]); 如果没有任何查询结果,IlluminateDatabaseEloquentModelNotFoundException 异常将会被抛出: $model = AppFlight::findOrFail(1); $model = AppFlight::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":"1@qq.com"}]     // 查询构建器实例,添加一个查询列到已存在的 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' => 'taylor@example.com', 'votes' => 0],     ['email' => 'dayle@example.com', '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 属性:

<?php namespace App; use IlluminateDatabaseEloquentModel; use IlluminateDatabaseEloquentSoftDeletes; class Flight extends Model {     use SoftDeletes;     // 应该被调整为日期的属性,并添加 deleted_at 列到数据表     protected $dates = [&#39;deleted_at&#39;]; } // laravel Schema 构建器包含一个辅助函数来创建该数据列: Schema::table(&#39;flights&#39;, function ($table) {     $table->softDeletes(); });

现在,当调用模型的 delete 方法时,deleted_at 列将被设置为当前日期和时间.

当查询一个使用软删除的模型时,被软删除的模型将会自动从查询结果中排除。

软删除的查询

判断给定模型实例是否被软删除,可以使用 trashed 方法:

if ($flight-&gt;trashed()) {     // } // 如果你想要软删除模型出现在查询结果中,可以使用 withTrashed 方法: $flights = AppFlight::withTrashed()             -&gt;where('account_id', 1)             -&gt;get();              // withTrashed 方法也可以用于关联查询中: $flight-&gt;history()-&gt;withTrashed()-&gt;get(); // onlyTrashed 方法只获取软删除模型: $flights = AppFlight::onlyTrashed()             -&gt;where('airline_id', 1)             -&gt;get();              // 恢复软删除模型,使用restore 方法: $flight-&gt;restore(); // 快速恢复多个模型,同样,这也不会触发任何模型事件: AppFlight::withTrashed()     -&gt;where('airline_id', 1)     -&gt;restore();      // 也可以用于关联查询: $flight-&gt;history()-&gt;restore(); // 永久删除模型,可以使用 forceDelete 方法: $flight-&gt;forceDelete(); // 强制删除单个模型实例... $flight-&gt;history()-&gt;forceDelete(); // 强制删除所有关联模型...

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享