如何在 laravel 的 eloquent 中转换表列数据?

Posted

技术标签:

【中文标题】如何在 laravel 的 eloquent 中转换表列数据?【英文标题】:How to convert a table column data inside eloquent in laravel? 【发布时间】:2022-01-02 06:08:21 【问题描述】:

我正在尝试将“CHECKTIME”表列日期时间转换为字符串,以便在 sql 中使用“LIKE”运算符。 LIKE 运算符不支持 dateaime 数据类型。因此,我必须将其转换为字符串才能使用 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();

用于返回数据的 SQL 查询:

SELECT CHECKINOUT.CHECKTIME
FROM CHECKINOUT
JOIN USERINFO ON USERINFO.USERID=CHECKINOUT.USERID
WHERE  CONVERT(VARCHAR(25), CHECKINOUT.CHECKTIME, 126) LIKE  '2021-11-23%';

【问题讨论】:

工作查询中的126 是什么?据我所知,CONVERT 只需要 2 个参数。无论如何,您可能需要拨打whereRaw 才能获得等价物。 @PaulT。 126 是错误的。但我对原始查询没有任何问题。我只需要在我雄辩的查询中将 CHECKINOUT.CHECKTIME 转换为字符串。 试用:->whereRaw('CONVERT(VARCHAR(25), CHECKINOUT.CHECKTIME) LIKE ?', $thisDay.'%') 所以您想查找特定日期的记录? 您不想将数据库日期转换为字符串然后查询。您只想查询日期:where('checktime', '>=', $thisDay)->where('checktime', '<', date('Y-m-d', strtotime($thisDay.' +1 day'))) 【参考方案1】:

首先,您可以使用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();

为了清楚起见,我已经将相关部分缩进了很多。

如果您有任何问题或改进建议,请联系 cmets :)

【讨论】:

以上是关于如何在 laravel 的 eloquent 中转换表列数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 5.8 中使用 Eloquent 进行查询?

如何在 laravel 5 中使用 Eloquent 更新数据透视表

如何在 Eloquent/Laravel 上查询子查询

如何在 laravel 中转发电子邮件?

如何在 Laravel 中定义 Eloquent 关系

Laravel Eloquent - orWhereHas 方法 - 何时使用以及如何使用