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
接口
<?php
namespace 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 将该类绑定到模型的中
<?php
namespace 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);
这样的限制条件。
使用闭包函数代替上面类
<?php
namespace 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
开头的方法
<?php
namespace 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();
设置可传入参数的本地作用域
<?php
namespace 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
第一步:编写处理事件的类
<?php
namespace 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)
{
//
}
}
第二步:注册观察者
<?php
namespace 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()
{
//
}
}