Laravel 9中Book模型的Eloquent查询逻辑应放置于何处?
问题解答
代码应该放在哪里?
必须放在Book模型里。这种和模型业务强相关的重复查询,就该封装在模型内部,遵循「胖模型、瘦控制器」的Eloquent设计原则。把查询逻辑集中在模型里,既能避免控制器代码臃肿,也方便后续修改(比如哪天要把"当年"改成"近12个月"),只需要改模型里的代码,不用挨个找所有调用的地方。
另外要提一句:你写的原始where语法有问题,正确的写法应该用whereYear来精准匹配年份,我会在封装方法里给你修正。
怎么封装和调用?
1. 在Book模型里定义静态方法
把查询逻辑封装成模型的静态方法,因为我们是获取一批书籍集合,不需要先实例化单个Book对象:
class Book extends Model { // 其他模型代码... public static function getPublished() { return self::where('published', true) ->whereYear('publish_date', date('Y')) ->get(); } }
2. 调用方式
在控制器或者其他业务代码里,直接通过模型类调用静态方法:
// 正确调用方式 $books = Book::getPublished();
而Book->getPublished()是实例化对象后的调用方式,这里完全不需要——我们不是要操作某一本具体的书,而是要获取符合条件的书籍列表,所以用静态调用::才是正确的。
内容的提问来源于stack exchange,提问作者bart
相关产品推荐
相关产品推荐

