0

0

Laravel的Eloquent 模型的介绍

不言

不言

发布时间:2018-07-04 15:31:25

|

2142人浏览过

|

来源于php中文网

原创

这篇文章主要介绍了关于laravel的eloquent 模型的介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

Eloquent 模型

默认继承use Illuminate\Database\Eloquent\Model类。

数据表名称与模型名称约定:

数据库的表名一般使用“蛇形命名法”命名。蛇形命名法要求单词小写,单词之间用_下划线连接,且名称是复数。

与之对应的模型名称,则使用“帕斯卡法“命名,即单词头一字母都大写。

如果不是按以上约定,则需指明对应的数据表:

class Flight extends Model
{    /**
     * 与模型关联的数据表
     *
     * @var string     */
    protected $table = 'myflights';
}

主键:

模型默认数据表用id字段作主键,并且是递增整数类型。这些可以自定义:

class Flight extends Model
{    /**
     * 与模型关联的数据表     */
    protected $table = 'my_flights';    protected $primaryKey='mid';  //自定义主键字段
    
    protected $keyType = 'string';  //自定义主键类型为字串
    
    public $incrementing = false;    //主键非自增型}

时间截:

模型默认存在created_at 和 updated_at两字段,可设定$timestamps不需两字段:

class Flight extends Model
{    /**
     * 该模型是否被自动维护时间戳     */
    public $timestamps = false;
}

$dateFormat属性可自定义时间截格式存储在数据表的格式:

class Flight extends Model
{    /**
     * 模型的日期字段的存储格式     */
    protected $dateFormat = 'U';
}

自定义时间截字段名:

自定义数据库连接:

class Flight extends Model
{    /**
     * 此模型的连接名称。     */
    protected $connection = 'connection-name';
}

模型查询:

use App\Flight;$flights = App\Flight::all();   //查询所有数据
foreach ($flights as $flight) {    echo $flight->name;
}$flights = App\Flight::where('active', 1)               
->orderBy('name', 'desc')               
->take(10)               
->get();             //有条件地查询数据

 all和get方法返回 Illuminate\Database\Eloquent\Collection实例。

如果查询大批量数据,可使用chunk,可节省内存:

Flight::chunk(200, function ($flights) {    foreach ($flights as $flight) {        //    }
});

或使用游标方法cursor大幅度减少内存的使用:

foreach (Flight::where('foo', 'bar')->cursor() as $flight) {    //}

查询单条数据:

// 通过主键取回一个模型...$flight = App\Flight::find(1);
// 取回符合查询限制的第一个模型 ...
$flight = App\Flight::where('active', 1)->first();//如果找不到模型则抛出异常
//Illuminate\Database\Eloquent\ModelNotFoundException
//自动返回 HTTP 404 响应给用户
$model = App\Flight::where('legs', '>', 100)->firstOrFail();

聚合查询:

$count = App\Flight::where('active', 1)->count();$max = App\Flight::where('active', 1)->max('price');

数据更新:

save方法:需要先检索一次,再设置要更新的属性再执行save方法,同时updated_at也会自动更新。

update方法:设置where条件,将更新字段以键值对传入update方法。该更新不会触发saved和updated模型事件。

$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';$flight->save(); //查询一次后再更新
App\Flight::where('active', 1)          
->where('destination', 'San Diego')          
->update(['delayed' => 1]); //设置条件后再批量更新

插入数据:

使用模型创建数据,需先设置$fillable或$guarded属性。两属性只能二选一。

class Flight extends Model
{    /**
     * 可以被批量赋值的属性。
     * @var array     */
    protected $fillable = ['name'];
}class Flight extends Model
{    /**
     * 不可被批量赋值的属性。可定义为空数组,表示所有属性都可以赋值。
     * @var array     */
    protected $guarded = ['price'];
}

插入数据的方法:

$flight = App\Flight::create(['name' => 'Flight 10']); //添加新记录并返回已保存的模型实例
$flight->fill(['name' => 'Flight 22']); //已有实例模型可使用fill方法
// 通过 name 属性检索航班,当结果不存在时创建它...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);// 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性去创建它$flight = App\Flight::firstOrCreate(
    ['name' => 'Flight 10'], ['delayed' => 1]
);// 通过 name 属性检索航班,当结果不存在时实例化...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);// 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性实例化$flight = App\Flight::firstOrNew(
    ['name' => 'Flight 10'], ['delayed' => 1]
);// 如果有从奥克兰飞往圣地亚哥的航班,将价格设为 99 美元
// 如果不存在匹配的模型就创建一个
$flight = App\Flight::updateOrCreate(
    ['departure' => 'Oakland', 'destination' => 'San Diego'],
    ['price' => 99]
);

firstOrCreate:如果查不到该数据,则根据第一参数和第二参数记录创建记录返回保存的模型;

firstOrNew:如果查不到该数据,则根据第一参数和第二参数记录创建新模型,但并未保存数据,需要手动save才可以保存数据;

updateOrCreate:根据第一参数作条件用更新第二参数数据,如果数据不存在则合并两参数创建记录返回保存的模型。

删除模型:

$flight = App\Flight::find(1);$flight->delete();  //通过查询所得的模型实例进行delete方法删除

//通过主键删除一至多条数据:App\Flight::destroy(1);
App\Flight::destroy([1, 2, 3]);
App\Flight::destroy(1, 2, 3);//通过查询条件批量删除,并返回删除条数
$deletedRows = App\Flight::where('active', 0)->delete();

批量删除时,deleted和deleting模型事件不会被触发。

 软删除:

数据表应设置deleted_at字段。模型内引用SoftDeletes trait,并设置deleted_at字段到$dates属性上。

设置了软删除的模型,在delete方法会设置deleted_at为当前日期和时间。查询软删除的模型会自动排除被软删除的模型。

动力先锋仿阿里巴巴B2B电子商务系统
动力先锋仿阿里巴巴B2B电子商务系统

前台功能介绍:1、网页首页显示有高级会员推荐,精品推荐,商业机会分类列表,最新供求信息,网站动态,推荐企业,行业动态等;2、商业机会栏目功能有:二级分类,已经带有详细分类的数据库,后台可以更改增加操作,并可以推荐公司,栏目分为分类显示信息,最新的采购、供应、合作和代理信息,搜索时同样按分类,信息,时间,交易类型等搜索;3、展厅展品栏目功能:二级分类,已经带有详细分类的数据库,后台可以更改增加操作,

下载
if ($flight->trashed()) {    //检查该模型实例是否被软删除}$flights = App\Flight::withTrashed()  //能使用查询包含软删除的数据
                ->where('account_id', 1)                ->get();$flights = App\Flight::onlyTrashed()  //只查询软删除的数据
                ->where('airline_id', 1)                ->get();$flight->restore();  //恢复被软删除的模型App\Flight::withTrashed()   //批量恢复模型,不会触发任何模型事件
        ->where('airline_id', 1)        ->restore();

软删除模型使用强制删除:

$flight->forceDelete();

查询作用域:

给模型添加查询约束。分全局和本地两种:

全局--每个查询都自动加条件约束;

本地--根据需要调用本地约束。

全局作用域:

首先需实现scope接口类.

where('age', '>', 200);
    }
}

如果全局作用域要将字段添加到查询的 select 语句中,则应该使用 addSelect 方法而不是 select,以免替换查询的现有select。

应用全局作用域:

在模型的boot方法使用addGlobalScope方法。

也可以使用闭包定义全局作用域,不必单独定义一个类:

class User extends Model
{    /**
     * 模型的「启动」方法
     *
     * @return void     */
    protected static function boot()
    {
        parent::boot();        
        static::addGlobalScope('age', function(Builder $builder) {            
        $builder->where('age', '>', 200);
        });
    }
}

删除全局作用域:

User::withoutGlobalScope(AgeScope::class)->get();  //删除指定的作用域

// 删除所有的全局作用域User::withoutGlobalScopes()->get();// 删除一些全局作用域User::withoutGlobalScopes([
    FirstScope::class, SecondScope::class])->get();

本地作用域:

定义通用的约束在需要时使用。定义方法:在模型内定义scope前缀的方法。

where('votes', '>', 100);
    }    /**
     * 限制查询只包括活跃的用户。
     *
     * @return \Illuminate\Database\Eloquent\Builder     */
    public function scopeActive($query)
    {        return $query->where('active', 1);
    }
}

使用方法:

$users = App\User::popular()->active()->orderBy('created_at')->get();

动态作用域:

class User extends Model
{    /**
     * 限制查询只包括指定类型的用户。
     *
     * @return \Illuminate\Database\Eloquent\Builder     */
    public function scopeOfType($query, $type)
    {        return $query->where('type', $type);
    }
}//调用作用域时传参$users = App\User::ofType('admin')->get();

模型事件:

retrieved --查询触发

creatingcreated--创建触发

updatingupdated--更新触发

savingsaved--创建、更新触发

deletingdeleted--删除触发

restoringrestored--恢复触发

事件指派相应的监控器:

 UserSaved::class,   //触发saved事件,调用UserSaved监控器
        'deleted' => UserDeleted::class, //触发deleted事件,调用UserDeleted监控器    ];
}

也可所有监听放在一个观察器类中:

注册观察器:

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

 Laravel 开发支付宝支付与提现转账的方法

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

57

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

57

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

237

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

393

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

17

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

103

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

73

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

81

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

swoole进程树解析
swoole进程树解析

共4课时 | 0.2万人学习

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

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