Laravel5.7 Eloquent ORM快速入门详解(9)

使用本地作用域

作用域被定义好了之后,就可以在查询模型的时候调用作用域方法,但调用时不需要加上 scope 前缀,你甚至可以同时调用多个作用域,例如:

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

动态作用域

有时候你可能想要定义一个可以接收参数的作用域,你只需要将额外的参数添加到你的作用域即可。作用域参数应该被定义在 $query 参数之后:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
 /**
  * 让查询只包含给定类型的用户
  *
  * @param \Illuminate\Database\Eloquent\Builder $query
  * @param mixed $type
  * @return \Illuminate\Database\Eloquent\Builder
  */
 public function scopeOfType($query, $type)
 {
  return $query->where('type', $type);
 }
}

现在,你可以在调用作用域时传递参数了:

$users = App\User::ofType('admin')->get();

比较模型

有时候你可能需要确定两个模型是否是一样的,is 方法可用于快速验证两个模型是否有相同的主键、数据表、以及数据库连接:

if ($post->is($anotherPost)) {
 //
}

事件

Eloquent 模型可以触发事件,允许你在模型生命周期中的多个时间点调用如下这些方法:retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored。事件允许你在一个指定模型类每次保存或更新的时候执行代码。

retrieved 事件会在从数据库中获取已存在模型时触发。当一个新模型被首次保存的时候,creating 和 created 事件会被触发。如果一个模型已经在数据库中存在并调用 save 方法,updating/updated 事件会被触发,无论是创建还是更新,saving/saved 事件都会被触发。

注:通过 Eloquent 进行批量更新时,模型事件 saved 和 updated 不会在更新模型上触发,这是因为这些模型在进行批量更新时没有真正检索过。

举个例子,在 Eloquent 模型中定义一个 $dispatchesEvents 属性来映射模型生命周期中多个时间点与对应事件类:

<?php

namespace App;

use App\Events\UserSaved;
use App\Events\UserDeleted;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
 use Notifiable;

 /**
  * The event map for the model.
  *
  * @var array
  */
 protected $dispatchesEvents = [
  'saved' => UserSaved::class,
  'deleted' => UserDeleted::class,
 ];
}


      

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5967.html