总结要点:本地作用域的使用,数据排序
本地作用域
让我们可以定义通用的约束集合,以便复用
例如,对于一个公用,大家都可以看到的列表,需要对其中的数据进行排序,例如,按照回复时间进行排序。由于这个排序的约束,对每一个用户,请求都是一样的,可以使用一个通用的约束,而不需要每次都新建一个
定义本地作用域
- 为模型想好一个约束方法的名字,例如
recent
- 根据约定,创建一个本地作用域,只需要直接在约束方法名字前面加上
scope
前缀,即scoptRecent
, 同时,这个方法接受一个查询构建器$query
作为参数,通过不断的链式调用,完善$query
中的参数,达到约束的作用,最后将它返回,即返回一个查询构造器- 这里对参数的
$query
的解释,是我自己猜的,感觉好像说的过去,先这样理解 - 如果有同学看到了,请辩证地看,有错误的地方请指出
- 这里对参数的
使用本地作用域
- 在对应的 Controller 调用,调用时,并不需要带上
scope
前缀,即调用recent
即可
教程中的调用有所不同,因为教程通过一个
scopeWithOrder
来作为入口,并根据 URI 中的order
参数再去调用真正的排序方法
按照这样理解的:
1:当我点击最后回复时,url地址是这样的:larabbs.test/topics?order=default,我的选项栏是在话题这样栏,所以是topics、
2:点击之后就进入到 TopicsControler中的index()方法。
3:执行withOrder()的方法,我们进入topicModel中看withOrder()方法
4:scopeWithOrder()中接收你传入进来的order值,然后根据order值不同,调用
scopreRecentReplied()和scopreRecent()方法,这两个方法呢,其实是加了对created_at和updated_at的一个排序。
5:最后得到一个$query是一个对象,在进行分页、
我没有搞懂的点是:scopeWithOrder($query,$order)是两个值,但是只传入一个一直,难道有一个值是默认自己调用的嘛?
其实scope可以写在控制器,然后控制器在switch判断,只是这样,其他模型就用不了,所以才写在topic模型的。多加一个判断,然后加上order()的条件语句、
https://laravel.com/api/5.7/Illuminate/Dat...
看文档,
$query
是查询构建器@wubuwei query_build