1、查询作用域
Eloquent还支持将一些常用的查询封装到模型方法中,方便调用,我们将其称之为“查询作用域”,实现查询作用域很简单,只需要在模型方法前加上scope前缀即可,比如我们经常需要获取浏览数最高的文章,就可以使用该机制实现——在Post中定义一个scopePopular方法:
public function scopePopular($query)
{
return $query->where('views','>=',100);
}
对应的,我们在控制器中定义测试代码如下:
$posts = Post::popular()->orderBy('views','desc')->get();
foreach ($posts as $post) {
echo '<'.$post->title.'> '.$post->views.'views
';
}
在浏览器中访问http://laravel.app:8000/test,输出如下:
此外,查询作用域还支持动态传入参数,为了测试该方法我们为posts新增一个status字段:
为posts表添加status字段
同时在模型类中新增一个scopeStatus方法:
public function scopeStatus($query,$status=1)
{
return $query->where('status',$status);
}
接下来测试下该方法:
$posts = Post::popular()->status(1)->orderBy('views','desc')->get();
foreach ($posts as $post) {
echo '<'.$post->title.'> '.$post->views.'views
';
}
对应输出如下:
2、模型事件
Eloquent也支持模型事件——当模型被创建、更新或删除的时候触发相应事件,Eloquent目前支持八种事件类型:creating、created、updating、updated、saving、saved、deleting、deleted。
deleting和deleted很好理解,在删除模型时触发,deleting在删除操作前执行,deleted在删除完成后执行。
当创建模型时,依次执行saving、creating、created和saved,同理在更新模型时依次执行saving、updating、updated和saved。无论是使用批量赋值(create/update)还是直接调用save方法,都会触发对应事件(前提是注册了相应的模型事件)。
你可以在任何你喜欢的地方注册模型事件,这里我们选择在服务提供者AppServiceProvider的boot方法中注册:
Post::saving(function($post){
echo 'saving event is fired
';
});
Post::creating(function($post){
echo 'creating event is fired
';
});
Post::created(function($post){
echo 'created event is fired
';
});
Post::saved(function($post){
echo 'saved event is fired
';
});
然后在控制器中编写测试代码如下:
$data = array(
'title'=>'test model event',
'content'=>'test content',
'cat_id'=>1,
);
$post = Post::create($data);
if(!$post->exists){
echo '添加文章失败!';exit();
}
echo '<'.$post->title.'>保存成功!';
接下来在浏览中访问http://laravel.app:8000/test,页面输入如下:
saving event is fired
creating event is fired
created event is fired
saved event is fired
保存成功!
需要注意的是如果saving/creating/updating/deleting事件返回false,则相应的创建/更新/删除操作会退出,不再往下执行,比如我们修改上述creating事件代码如下:
Post::creating(function($post){
echo 'creating event is fired
';
if($post->cat_id==1)
return false;
});
也就是当文章分类id等于1的时候,不再往下执行,在浏览器中再次访问http://laravel.app:8000/test,页面输出如下:
saving event is fired
creating event is fired
添加文章失败!
有了模型事件之后,我们就很方便地在模型创建、更新或删除的不同生命周期阶段添加相应的业务逻辑。
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔