如何在laravel中转换eloquent内的table列数据?
How to convert a table column data inside eloquent in laravel?
我正在尝试将 'CHECKTIME' table 列日期时间转换为字符串,以便在 sql 中使用 'LIKE' 运算符。 LIKE 运算符不支持 datetaime 数据类型。所以,我必须将它转换成字符串才能使用 LIKE。 laravel eloquent 怎么办?我在控制器中的代码:
$dailyData=CheckInOutModel::join('USERINFO', 'USERINFO.USERID', '=', 'CHECKINOUT.USERID')
->select('USERINFO.USERID as id','USERINFO.BADGENUMBER as bd', 'USERINFO.NAME as name','USERINFO.Image as photo','CHECKINOUT.*')
->where(CONVERT(VARCHAR(25),' CHECKINOUT.CHECKTIME'),'LIKE',$thisDay.'%')
->orderBy('CHECKINOUT.CHECKTIME','desc')->get();
对return数据起作用的SQL查询:
SELECT CHECKINOUT.CHECKTIME
FROM CHECKINOUT
JOIN USERINFO ON USERINFO.USERID=CHECKINOUT.USERID
WHERE CONVERT(VARCHAR(25), CHECKINOUT.CHECKTIME, 126) LIKE '2021-11-23%';
首先,您可以使用 whereRaw()
(see link) 方法在查询中注入原始 SQL。
这将是这样的:
$dailyData=CheckInOutModel::join('USERINFO', 'USERINFO.USERID', '=', 'CHECKINOUT.USERID')
->select('USERINFO.USERID as id','USERINFO.BADGENUMBER as bd', 'USERINFO.NAME as name','USERINFO.Image as photo','CHECKINOUT.*')
->whereRaw('CONVERT(VARCHAR(25), CHECKINOUT.CHECKTIME) LIKE ?', $thisDay.'%')
->orderBy('CHECKINOUT.CHECKTIME','desc')->get();
但由于您使用的是日期,因此建议始终使用日期,而不是将数据转换为字符串比较。
另一种方法是直接将 whereBetween
与日期一起使用。 (see link)
例子:
$dailyData=CheckInOutModel::join('USERINFO', 'USERINFO.USERID', '=', 'CHECKINOUT.USERID')
->select('USERINFO.USERID as id','USERINFO.BADGENUMBER as bd', 'USERINFO.NAME as name','USERINFO.Image as photo','CHECKINOUT.*')
->whereBetween(
'CHECKINOUT.CHECKTIME',
[
$thisDay,
date('Y-m-d', strtotime('+1 day', $thisDay))
]
)->orderBy('CHECKINOUT.CHECKTIME','desc')->get();
为了清楚起见,我将相关部分过度缩进了。
如果您有任何问题或改进建议,请发表评论:)
我正在尝试将 'CHECKTIME' table 列日期时间转换为字符串,以便在 sql 中使用 'LIKE' 运算符。 LIKE 运算符不支持 datetaime 数据类型。所以,我必须将它转换成字符串才能使用 LIKE。 laravel eloquent 怎么办?我在控制器中的代码:
$dailyData=CheckInOutModel::join('USERINFO', 'USERINFO.USERID', '=', 'CHECKINOUT.USERID')
->select('USERINFO.USERID as id','USERINFO.BADGENUMBER as bd', 'USERINFO.NAME as name','USERINFO.Image as photo','CHECKINOUT.*')
->where(CONVERT(VARCHAR(25),' CHECKINOUT.CHECKTIME'),'LIKE',$thisDay.'%')
->orderBy('CHECKINOUT.CHECKTIME','desc')->get();
对return数据起作用的SQL查询:
SELECT CHECKINOUT.CHECKTIME
FROM CHECKINOUT
JOIN USERINFO ON USERINFO.USERID=CHECKINOUT.USERID
WHERE CONVERT(VARCHAR(25), CHECKINOUT.CHECKTIME, 126) LIKE '2021-11-23%';
首先,您可以使用 whereRaw()
(see link) 方法在查询中注入原始 SQL。
这将是这样的:
$dailyData=CheckInOutModel::join('USERINFO', 'USERINFO.USERID', '=', 'CHECKINOUT.USERID')
->select('USERINFO.USERID as id','USERINFO.BADGENUMBER as bd', 'USERINFO.NAME as name','USERINFO.Image as photo','CHECKINOUT.*')
->whereRaw('CONVERT(VARCHAR(25), CHECKINOUT.CHECKTIME) LIKE ?', $thisDay.'%')
->orderBy('CHECKINOUT.CHECKTIME','desc')->get();
但由于您使用的是日期,因此建议始终使用日期,而不是将数据转换为字符串比较。
另一种方法是直接将 whereBetween
与日期一起使用。 (see link)
例子:
$dailyData=CheckInOutModel::join('USERINFO', 'USERINFO.USERID', '=', 'CHECKINOUT.USERID')
->select('USERINFO.USERID as id','USERINFO.BADGENUMBER as bd', 'USERINFO.NAME as name','USERINFO.Image as photo','CHECKINOUT.*')
->whereBetween(
'CHECKINOUT.CHECKTIME',
[
$thisDay,
date('Y-m-d', strtotime('+1 day', $thisDay))
]
)->orderBy('CHECKINOUT.CHECKTIME','desc')->get();
为了清楚起见,我将相关部分过度缩进了。
如果您有任何问题或改进建议,请发表评论:)