服务端DataTable实现:如何在控制器中读取dd/mm/yy格式的日期用于搜索
服务端DataTable实现:如何在控制器中读取dd/mm/yy格式的日期用于搜索
嗨,我完全明白你遇到的困扰——服务端DataTable的全局搜索没办法匹配用户输入的dd/mm/yy格式日期,只能识别数据库默认的Y-m-d格式,而且你之前尝试的写法还触发了Ajax错误,这确实挺头疼的。
先说说你之前代码的问题:你用PHP的date()和strtotime()函数来处理birthDate,但这两个函数是在PHP本地执行的,它们会把字符串'birthDate'当成日期来转换,而不是去读取数据库里的字段值,这自然会生成错误的内容,导致SQL查询出错,进而触发DataTable的Ajax警告。
正确的思路是让数据库来完成日期格式的转换,再和用户的搜索词做匹配。下面是针对Laravel+MySQL场景的解决方案:
你需要用MySQL的DATE_FORMAT()函数,把数据库中存储的birthDate字段转换为dd/mm/yy格式,再进行模糊搜索。在Laravel里可以通过DB::raw()来嵌入原生SQL函数,修改你的全局搜索代码:
// get data from user_dummies table $query = DB::table('user_dummies')->select('*'); // Global Search $search = $request->search; $query = $query->where(function ($query) use ($search) { $query->orWhere('firstName', 'like', "%" . $search . "%"); $query->orWhere('lastName', 'like', "%" . $search . "%"); $query->orWhere('age', 'like', "%" . $search . "%"); // 替换原来的birthDate搜索逻辑 $query->orWhere(DB::raw("DATE_FORMAT(birthDate, '%d/%m/%y')"), 'like', "%" . $search . "%"); $query->orWhere('role', 'like', "%" . $search . "%"); });
这样修改后,数据库会先把birthDate字段的值转换成dd/mm/yy格式,再和用户输入的搜索词进行模糊匹配,就能正确识别用户输入的日期格式了。
如果你的项目用的是其他数据库(比如PostgreSQL),只需要把DATE_FORMAT换成对应数据库的日期格式化函数即可(比如PostgreSQL用TO_CHAR(birthDate, 'DD/MM/YY'))。
备注:内容来源于stack exchange,提问作者ghost_of_the_code
相关产品推荐
相关产品推荐

