Laravel 5.4 官方文档摘记:Eloquent ORM
来源:互联网 发布:淘宝限时抢购 编辑:程序博客网 时间:2024/06/05 00:26
Eloquent ORM
参数名称与作用
$table
表名
$primaryKey
主键名
$timestamps
新增、删除时间字段
当该参数设置为true
时,默认在当前表中存在created_at
和updated_at
字段,表示该记录创建时间和更新时间。
$dateFormat
时间保存格式
CREATED_AT
和 UPDATED_AT
上面将$timestamps
设置为true
时,created_at
和updated_at
字段的名称是由这两个参数指定的。
$connection
数据库连接
注意,这里的$connection
不是指真正的数据库连接,而是在config/database.php
中的connections
中设置的连接名称。
查询
当进行模型操作时,很多命令和直接使用DB
进行操作是一样的,这里列出了一些DB的操作。
异常查询
- findOrFail
- firstOrFail
使用上述命令进行查询时,如果模型不存在,则会抛出异常,异常名称为Illuminate\Database\Eloquent\ModelNotFoundException
插入数据/更新数据 save
插入数据
// 实例化模型$user=new User;$user->name="trouble i am in";$user->age=10;$user->save();
更新数据
// 查询到实例对象$user=User::find($user_id);$user->name="trouble i am in";$user->age=18;$user->save();
批量更新 update
跟这里的用法是一样的。
指定批量更新字段 $fillable / $guarded
比如你想将POST
过来的表单直接保存进数据库,但是又不想用户恶意传递非法字段进来,所以最好的办法就是使用该属性指定填充字段。
$fillable
白名单
$guarded
黑名单
获取模型实例
在使用save
进行更新数据之前,需要先获取一个模型实例,上面我们是直接使用find
进行查询的,这里介绍更多查询方式:
$user1=User->find(['user_id'=>$user_id]);$user2=User->findOrCreate(['user_id'=>$user_id]);$user3=User->firstOrNew(['user_id'=>$user_id]);
上面获取后还需要使用$user->save();
进行保存。除了firstOrNew
,还有updateOrCreate
。这两个操作都不需要使用$user->save();
来将数据保存进数据库。
删除模型 delete
$user=User::find(['user_id'=>$user_id]);$user->delete();
通过主键删除模型 destroy
$user->destroy([ $user_id1, $user_id2, $user_id3]);
软删除
设置软删除
软删除的字段默认为deleted_at
。设置软删除的过程如下:
将
deleted_at
添加到数据库表字段调用
Illuminate\Database\Eloquent\SoftDeletes
use Illuminate\Database\Eloquent\SoftDeletes;class User extends Model{ use SoftDeletes; protected $datea=['deleted_at'];}
这样设置完成后,当你对该表做delete
操作时,仅仅就是修改deleted_at
字段,而不会删除数据库数据了。
获取被软件除模型 withTrashed
只获取被删除模型 onlyTrashed
恢复软删除模型 restore
强制删除模型 forceDelete
查询作用域
所谓查询作用域,就是针对该配置下的每一次查询都要有效。
设置全局作用域
- Step 1 创建作用域类
该作用域类扩展Illuminate\Database\Eloquent\Scope
接口
<?phpnamespace App\Scopes;use Illuminate\Database\Eloquent\Scope;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\Builder;// 类名随便起,存放位置也随便,不是自动调用的,需要我们下面进行设置的class AgeScope implements Scope{ /** * 应用作用域到给定的Eloquent查询构建器. * * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database\Eloquent\Model $model * @return void * @translator laravelacademy.org */ public function apply(Builder $builder, Model $model) { return $builder->where('age', '>', 200); }}
- Step 2 将该类绑定到模型的中
<?phpnamespace App;use App\Scopes\AgeScope;use Illuminate\Database\Eloquent\Model;class User extends Model{ /** * 模型的“启动”方法. * * @return void */ protected static function boot() { parent::boot(); // 这里进行调用 static::addGlobalScope(new AgeScope); }}
这样设置好之后,每次User
的查询时,都会加上$builder->where('age', '>', 200);
这样的限制条件。
使用闭包函数代替上面类
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\Builder;class User extends Model{ /** * The "booting" method of the model. * * @return void */ protected static function boot() { parent::boot(); static::addGlobalScope('age', function(Builder $builder) { $builder->where('age', '>', 200); }); }}
移除作用域
移除全部全局作用域
User::withoutGlobalScopes()->get();
移除部分全局作用域
User::withoutGlobalScopes([ FirstScope::class, SecondScope::class])->get();
设置可设置的作用域(本地作用域)
- Step 1 设置以
scope
开头的方法
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{ /** * 这个函数做什么不重要,重点在于你在外部如何调用它 * * @return \Illuminate\Database\Eloquent\Builder */ public function scopePopular($query) { return $query->where('votes', '>', 100); } /** * 注意,所有的方法都是以 scope 开头 * * @return \Illuminate\Database\Eloquent\Builder */ public function scopeActive($query) { return $query->where('active', 1); }}
在外部可以这样直接调用其中的作用域:
$users = App\User::popular()->active()->orderBy('created_at')->get();
设置可传入参数的本地作用域
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{ /** * 注意,这里加上了额外的外部参数 $type * * @return \Illuminate\Database\Eloquent\Builder */ public function scopeOfType($query, $type) { return $query->where('type', $type); }}
在外部可以直接在调用该本地作用域的时候传入参数:
$users = App\User::ofType('admin')->get();
事件
一个模型被新建的时候触发该事件:
- creating
- created
数据被更新的时候触发该事件:
- updating
- updated
新增数据或者更新数据都可以使用save()
方法,所以都会触发该事件
- saving
- saved
删除
- deleting
- deleted
软删除
- restoring
- restored
第一步:编写处理事件的类
<?phpnamespace App\Observers;use App\User;class UserObserver{ /** * 监听用户创建事件. * * @param User $user * @return void */ public function created(User $user) { // } /** * 监听用户删除事件. * * @param User $user * @return void */ public function deleting(User $user) { // }}
第二步:注册观察者
<?phpnamespace App\Providers;use App\User;use App\Observers\UserObserver;use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider{ /** * Bootstrap any application services. * * @return void */ public function boot() { // 在这里对该模型注册观察者 User::observe(UserObserver::class); } /** * Register the service provider. * * @return void */ public function register() { // }}
- Laravel 5.4 官方文档摘记:Eloquent ORM
- Laravel 5.4 官方文档摘记:路由
- Laravel 5.4 官方文档摘记:中间件
- Laravel 5.4 官方文档摘记:CSRF保护
- Laravel 5.4 官方文档摘记:控制器
- Laravel 5.4 官方文档摘记:请求实例
- Laravel 5.4 官方文档摘记:响应
- Laravel 5.4 官方文档摘记:View类
- Laravel 5.4 官方文档摘记:验证
- Laravel 5.4 官方文档摘记:视图
- Laravel 5.4 官方文档摘记:Laravel操作数据库
- Laravel Eloquent ORM--整理
- laravel Eloquent ORM
- Laravel Eloquent ORM--整理
- Laravel Eloquent ORM--整理
- Laravel基础-Eloquent ORM 模型
- laravel笔记-Eloquent ORM(基础)
- laravel笔记-Eloquent ORM(杂项)
- 06.12 cobbler无人值守安装
- 进程间的通信
- Nexus 6p 内核编译
- iOS CoreBluetooth 的使用讲解
- 第一章、MATLAB运行环境
- Laravel 5.4 官方文档摘记:Eloquent ORM
- ros apollo vrep project ubuntu14.04 (一)
- 移动端点透现象即解决办法
- python实现的入门级别死爬虫
- POJ-1723
- Javascript对象和数组操作符——.和[]
- 程序员的幽默——献给所有Java程序员
- Linux mysql初始化密码问题
- 数据存储(3):将数据以txt文件存储在本地,多个apk都可进行读写