Laravel的Eloquent模型的介绍
内容导读
收集整理的这篇技术教程文章主要介绍了Laravel的Eloquent模型的介绍,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含9518字,纯文字阅读大概需要14分钟。
内容图文
这篇文章主要介绍了关于Laravel的Eloquent 模型的介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下Eloquent 模型
默认继承use IlluminateDatabaseEloquentModel类。
数据表名称与模型名称约定:
数据库的表名一般使用“蛇形命名法”命名。蛇形命名法要求单词小写,单词之间用_下划线连接,且名称是复数。
与之对应的模型名称,则使用“帕斯卡法“命名,即单词头一字母都大写。
如果不是按以上约定,则需指明对应的数据表:
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';}
自定义时间截字段名:
<?phpclass Flight extends Model{ const CREATED_AT = 'creation_date'; const UPDATED_AT = 'last_update';}
自定义数据库连接:
class Flight extends Model{ /** * 此模型的连接名称。 */ protected $connection = 'connection-name';}
模型查询:
use AppFlight;$flights = AppFlight::all(); //查询所有数据foreach ($flights as $flight) { echo $flight->name;}$flights = AppFlight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get(); //有条件地查询数据
all和get方法返回 IlluminateDatabaseEloquentCollection实例。
如果查询大批量数据,可使用chunk,可节省内存:
Flight::chunk(200, function ($flights) { foreach ($flights as $flight) { // }});
或使用游标方法cursor大幅度减少内存的使用:
foreach (Flight::where('foo', 'bar')->cursor() as $flight) { //}
查询单条数据:
// 通过主键取回一个模型...$flight = AppFlight::find(1);// 取回符合查询限制的第一个模型 ...$flight = AppFlight::where('active', 1)->first();//如果找不到模型则抛出异常//IlluminateDatabaseEloquentModelNotFoundException//自动返回 HTTP 404 响应给用户$model = AppFlight::where('legs', '>', 100)->firstOrFail();
聚合查询:
$count = AppFlight::where('active', 1)->count();$max = AppFlight::where('active', 1)->max('price');
数据更新:
save方法:需要先检索一次,再设置要更新的属性再执行save方法,同时updated_at也会自动更新。
update方法:设置where条件,将更新字段以键值对传入update方法。该更新不会触发saved和updated模型事件。
$flight = AppFlight::find(1);$flight->name = 'New Flight Name';$flight->save(); //查询一次后再更新AppFlight::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 = AppFlight::create(['name' => 'Flight 10']); //添加新记录并返回已保存的模型实例$flight->fill(['name' => 'Flight 22']); //已有实例模型可使用fill方法
// 通过 name 属性检索航班,当结果不存在时创建它...$flight = AppFlight::firstOrCreate(['name' => 'Flight 10']);// 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性去创建它$flight = AppFlight::firstOrCreate( ['name' => 'Flight 10'], ['delayed' => 1]);// 通过 name 属性检索航班,当结果不存在时实例化...$flight = AppFlight::firstOrNew(['name' => 'Flight 10']);// 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性实例化$flight = AppFlight::firstOrNew( ['name' => 'Flight 10'], ['delayed' => 1]);// 如果有从奥克兰飞往圣地亚哥的航班,将价格设为 99 美元// 如果不存在匹配的模型就创建一个$flight = AppFlight::updateOrCreate( ['departure' => 'Oakland', 'destination' => 'San Diego'], ['price' => 99]);
firstOrCreate:如果查不到该数据,则根据第一参数和第二参数记录创建记录返回保存的模型;
firstOrNew:如果查不到该数据,则根据第一参数和第二参数记录创建新模型,但并未保存数据,需要手动save才可以保存数据;
updateOrCreate:根据第一参数作条件用更新第二参数数据,如果数据不存在则合并两参数创建记录返回保存的模型。
删除模型:
$flight = AppFlight::find(1);$flight->delete(); //通过查询所得的模型实例进行delete方法删除//通过主键删除一至多条数据:AppFlight::destroy(1);AppFlight::destroy([1, 2, 3]);AppFlight::destroy(1, 2, 3);//通过查询条件批量删除,并返回删除条数$deletedRows = AppFlight::where('active', 0)->delete();
批量删除时,deleted和deleting模型事件不会被触发。
软删除:
数据表应设置deleted_at字段。模型内引用SoftDeletes trait,并设置deleted_at字段到$dates属性上。
<?phpnamespace App;use IlluminateDatabaseEloquentModel;use IlluminateDatabaseEloquentSoftDeletes;class Flight extends Model{ use SoftDeletes; /** * 需要被转换成日期的属性。 * @var array */ protected $dates = ['deleted_at']; }
设置了软删除的模型,在delete方法会设置deleted_at为当前日期和时间。查询软删除的模型会自动排除被软删除的模型。
if ($flight->trashed()) { //检查该模型实例是否被软删除}$flights = AppFlight::withTrashed() //能使用查询包含软删除的数据 ->where('account_id', 1) ->get();$flights = AppFlight::onlyTrashed() //只查询软删除的数据 ->where('airline_id', 1) ->get();$flight->restore(); //恢复被软删除的模型AppFlight::withTrashed() //批量恢复模型,不会触发任何模型事件 ->where('airline_id', 1) ->restore();
软删除模型使用强制删除:
$flight->forceDelete();
查询作用域:
给模型添加查询约束。分全局和本地两种:
全局--每个查询都自动加条件约束;
本地--根据需要调用本地约束。
全局作用域:
首先需实现scope接口类.
<?phpnamespace AppScopes;use IlluminateDatabaseEloquentScope;use IlluminateDatabaseEloquentModel;use IlluminateDatabaseEloquentBuilder;class AgeScope implements Scope{ /** * 将范围应用于给定的 Eloquent 查询生成器 * * @param IlluminateDatabaseEloquentBuilder $builder * @param IlluminateDatabaseEloquentModel $model * @return void */ public function apply(Builder $builder, Model $model) { return $builder->where('age', '>', 200); }}
如果全局作用域要将字段添加到查询的 select 语句中,则应该使用 addSelect
方法而不是 select,以免替换查询的现有select。
应用全局作用域:
在模型的boot方法使用addGlobalScope方法。
<?phpnamespace App;use AppScopesAgeScope;use IlluminateDatabaseEloquentModel;class User extends Model{ /** * 模型的「启动」方法 * * @return void */ protected static function boot() { parent::boot(); static::addGlobalScope(new AgeScope); }}
也可以使用闭包定义全局作用域,不必单独定义一个类:
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前缀的方法。
<?phpnamespace App;use IlluminateDatabaseEloquentModel;class User extends Model{ /** * 限制查询只包括受欢迎的用户。 * * @return IlluminateDatabaseEloquentBuilder */ public function scopePopular($query) { return $query->where('votes', '>', 100); } /** * 限制查询只包括活跃的用户。 * * @return IlluminateDatabaseEloquentBuilder */ public function scopeActive($query) { return $query->where('active', 1); }}
使用方法:
$users = AppUser::popular()->active()->orderBy('created_at')->get();
动态作用域:
class User extends Model{ /** * 限制查询只包括指定类型的用户。 * * @return IlluminateDatabaseEloquentBuilder */ public function scopeOfType($query, $type) { return $query->where('type', $type); }}//调用作用域时传参$users = AppUser::ofType('admin')->get();
模型事件:
retrieved
--查询触发
creating
、created--创建触发
updating
、updated--更新触发
saving
、saved--创建、更新触发
deleting
、deleted--删除触发
restoring
、restored--恢复触发
事件指派相应的监控器:
<?phpnamespace App;use AppEventsUserSaved;use AppEventsUserDeleted;use IlluminateNotificationsNotifiable;use IlluminateFoundationAuthUser as Authenticatable;class User extends Authenticatable{ use Notifiable; /** * 模型的事件映射。 * * @var array */ protected $dispatchesEvents = [ 'saved' => UserSaved::class, //触发saved事件,调用UserSaved监控器 'deleted' => UserDeleted::class, //触发deleted事件,调用UserDeleted监控器 ];}
也可所有监听放在一个观察器类中:
<?phpnamespace AppObservers;use AppUser;class UserObserver{ /** * 监听用户创建的事件。 * * @param User $user * @return void */ public function created(User $user) { // } /** * 监听用户删除事件。 * * @param User $user * @return void */ public function deleting(User $user) { // }}
注册观察器:
<?phpnamespace AppProviders;use AppUser;use AppObserversUserObserver;use IlluminateSupportServiceProvider;class AppServiceProvider extends ServiceProvider{ /** * 运行所有应用. * * @return void */ public function boot() { User::observe(UserObserver::class); }}
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
Laravel 开发支付宝支付与提现转账的方法
以上就是Laravel的Eloquent 模型的介绍的详细内容,更多请关注Gxl网其它相关文章!
内容总结
以上是为您收集整理的Laravel的Eloquent模型的介绍全部内容,希望文章能够帮你解决Laravel的Eloquent模型的介绍所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。