Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  php  >  正文 Laraverl Eloquent查询作用域和模型事件

Laraverl Eloquent查询作用域和模型事件

发布时间:2017-12-13   编辑:www.jquerycn.cn
jquery中文网为您提供Laraverl Eloquent查询作用域和模型事件等资源,欢迎您收藏本站,我们将为您提供最新的Laraverl Eloquent查询作用域和模型事件资源
下面我们来看一篇关于Laraverl Eloquent查询作用域和模型事件详解了,希望对新手朋友能够带来帮助,具体的如下介绍。

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 '&lt;'.$post->title.'&gt; '.$post->views.'views<br>';
}

在浏览器中访问http://laravel.app:8000/test,输出如下:

<test 3> 800views
<test 2> 500views
<test 1 title> 100views

此外,查询作用域还支持动态传入参数,为了测试该方法我们为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 '&lt;'.$post->title.'&gt; '.$post->views.'views<br>';
}

对应输出如下:

<test 3> 800views
<test 2> 500views

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<br>';
});

Post::creating(function($post){
    echo 'creating event is fired<br>';
});

Post::created(function($post){
    echo 'created event is fired<br>';
});

Post::saved(function($post){
    echo 'saved event is fired<br>';
});

然后在控制器中编写测试代码如下:

$data = array(
    'title'=>'test model event',
    'content'=>'test content',
    'cat_id'=>1,
);
$post = Post::create($data);
if(!$post->exists){
    echo '添加文章失败!';exit();
}
echo '&lt;'.$post->title.'&gt;保存成功!';


接下来在浏览中访问http://laravel.app:8000/test,页面输入如下:

saving event is fired
creating event is fired
created event is fired
saved event is fired
<test model event>

保存成功!

需要注意的是如果saving/creating/updating/deleting事件返回false,则相应的创建/更新/删除操作会退出,不再往下执行,比如我们修改上述creating事件代码如下:

Post::creating(function($post){
    echo 'creating event is fired<br>';
    if($post->cat_id==1)
        return false;
});

也就是当文章分类id等于1的时候,不再往下执行,在浏览器中再次访问http://laravel.app:8000/test,页面输出如下:

saving event is fired
creating event is fired

添加文章失败!
有了模型事件之后,我们就很方便地在模型创建、更新或删除的不同生命周期阶段添加相应的业务逻辑。

您可能感兴趣的文章:
Laraverl Eloquent查询作用域和模型事件
Lumen 5.2 数据库的基本操作
swoole laravel 区别
mysql加速查询速度利器之查询缓存
学习mysql的查询缓存
Laravel 5.2数据库安装配置及简单例子
Laravel Moderation 实现内容审核的例子
Laravel 5.2 数据库填充数据的使用例子
Laravel 的 Events 及 Observers何时使用事件
学习邮件服务器之MX记录

[关闭]