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,
];
}
内容版权声明:除非注明,否则皆为本站原创文章。
