Laravel按日期查询product表返回空数组的解决方法
问题原因
你当前使用的where语句是精确匹配逻辑,created_at字段为datetime类型,存储值包含时分秒,你传入的2019-01-12会被解析为2019-01-12 00:00:00,和表中存储的带具体时间的记录无法匹配,因此返回空结果。
可行实现方案
方案1:使用whereDate查询(推荐,可读性最高)
Laravel查询构造器专门提供了whereDate方法,用于匹配日期字段的日期部分,自动忽略时分秒:
public function index() { $product = Product::select('id', 'name', 'created_at') ->whereDate('created_at', '2019-01-12') ->get() ->toArray(); dd($product); }
方案2:使用时间区间查询(性能最高,适合大数据量表)
筛选created_at处于当天0点到次日0点之间的记录,可以命中created_at字段的普通索引:
public function index() { $product = Product::select('id', 'name', 'created_at') ->whereBetween('created_at', ['2019-01-12 00:00:00', '2019-01-13 00:00:00']) ->get() ->toArray(); dd($product); }
方案3:使用SQL日期函数匹配
直接调用MySQL的DATE()函数提取created_at的日期部分进行匹配:
public function index() { $product = Product::select('id', 'name', 'created_at') ->whereRaw('DATE(created_at) = ?', ['2019-01-12']) ->get() ->toArray(); dd($product); }
小提示:如果表数据量超过10万,优先使用方案2的区间查询,避免字段函数转换导致索引失效,查询效率远高于另外两种方案。
内容的提问来源于stack exchange,提问作者deskeay
相关产品推荐
相关产品推荐

