0

0

Laravel 中Eloquent ORM 相关操作

藏色散人

藏色散人

发布时间:2019-11-14 14:40:59

|

3035人浏览过

|

来源于segmentfault

转载

定义

操作

获取(查询)

获取集合,(查询列表)

返回值是 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":"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 = 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":"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(); // 同上

分组

.net全诚外卖通之外卖预订合众版
.net全诚外卖通之外卖预订合众版

外卖预订合众版,顾名思义,这个平台是把外卖版和预订版做了一个合体。在此版本中,外卖和预订二者都不是作为附属存在,而是作为两个重点存在;此版中,系统将外卖店铺和预订店铺做了一个很好的区分,哪些是外卖店铺,哪些是预订店铺。也可以将某一个店铺设置为既是外卖店铺又是预订店铺。属于外卖店铺的执行和外卖相关的操作,是预订店铺的则执行和预订相关的操作。此版的优势在于扩大了平台经营的目标,而不是单 纯的停留在或者

下载
$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 属性:

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组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

316

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

271

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

369

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

370

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

81

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

64

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.08.05

c语言union的用法
c语言union的用法

c语言union的用法是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,union的使用可以帮助我们节省内存空间,并且可以方便地在不同的数据类型之间进行转换。使用union时需要注意对应的成员是有效的,并且只能同时访问一个成员。本专题为大家提供union相关的文章、下载、课程内容,供大家免费下载体验。

122

2023.09.27

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

6

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号