Laravel中GET请求传递日期无法查询数据库数据问题
GET请求传日期查新闻无结果的问题排查与解决
我通过GET请求传递日期获取对应新闻数据,发起的请求链接是 http://127.0.0.1:8000/api//news/search/"2022-05-10",但数据库里明明存在2022-05-10的新闻数据,却始终查询不到结果。
控制器代码
public function getNewsDate($dates) { $news = News::where('date', $dates)->get(); if ($news) { return response()->json($news, 200); } else { return response()->json('News not found', 404); } }
问题原因及解决办法
1. 请求参数带多余引号
请求链接里的日期被双引号包裹("2022-05-10"),导致控制器接收的$dates参数值是"2022-05-10",和数据库中存储的纯日期字符串2022-05-10不匹配,自然查不到数据。
- 解决:把链接改成
http://127.0.0.1:8000/api/news/search/2022-05-10,同时去掉链接里的双斜杠api//news(部分框架会自动忽略,但规范写法用单斜杠)。
2. 集合判断逻辑错误
News::where()->get()返回的是Eloquent集合,哪怕没有数据,集合对象也不为空,所以if ($news)永远为true,不会触发404返回。
- 解决:改用
isNotEmpty()方法判断集合是否有数据:public function getNewsDate($dates) { $news = News::where('date', $dates)->get(); if ($news->isNotEmpty()) { return response()->json($news, 200); } else { return response()->json('News not found', 404); } }
3. 日期字段类型不匹配
如果数据库中date字段是datetime/timestamp类型(存储值类似2022-05-10 14:30:00),直接用where('date', $dates)精确匹配纯日期字符串会失败,因为带时间部分。
- 解决:使用
whereDate()方法只匹配日期部分:$news = News::whereDate('date', $dates)->get();
内容的提问来源于stack exchange,提问作者Tanvir Ahmed
相关产品推荐
相关产品推荐

