总结要点:本地作用域的使用,数据排序

本地作用域

让我们可以定义通用的约束集合,以便复用

例如,对于一个公用,大家都可以看到的列表,需要对其中的数据进行排序,例如,按照回复时间进行排序。由于这个排序的约束,对每一个用户,请求都是一样的,可以使用一个通用的约束,而不需要每次都新建一个

定义本地作用域

  • 为模型想好一个约束方法的名字,例如 recent
  • 根据约定,创建一个本地作用域,只需要直接在约束方法名字前面加上 scope 前缀,即 scoptRecent, 同时,这个方法接受一个查询构建器 $query 作为参数,通过不断的链式调用,完善 $query 中的参数,达到约束的作用,最后将它返回,即返回一个查询构造器
    • 这里对参数的 $query 的解释,是我自己猜的,感觉好像说的过去,先这样理解
    • 如果有同学看到了,请辩证地看,有错误的地方请指出

使用本地作用域

  • 在对应的 Controller 调用,调用时,并不需要带上 scope 前缀,即调用 recent 即可

教程中的调用有所不同,因为教程通过一个 scopeWithOrder 来作为入口,并根据 URI 中的 order 参数再去调用真正的排序方法

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

按照这样理解的:
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()的条件语句、

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!