Laravel 5.4 官方文档摘记:Eloquent ORM

来源:互联网 发布:淘宝限时抢购 编辑:程序博客网 时间:2024/06/05 00:26

Eloquent ORM

参数名称与作用

$table 表名

$primaryKey 主键名

$timestamps 新增、删除时间字段

当该参数设置为true时,默认在当前表中存在created_atupdated_at字段,表示该记录创建时间和更新时间。

$dateFormat 时间保存格式

CREATED_ATUPDATED_AT

上面将$timestamps设置为true时,created_atupdated_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()    {        //    }}