【问题标题】:whereBetween in Laravel not working well with CarbonwhereBetween 在 Laravel 中不能很好地使用 Carbon
【发布时间】:2016-04-20 22:32:22
【问题描述】:

我要查询2016-01-10创建的用户。所以 Laravel 5.1 中的代码是这样的(created_at 是时间戳):

$day1 = new Carbon();
$day1->year = 2016;
$day1->month = 1;
$day1->day = 10;

$day2 = new Carbon();
$day2->year = 2016;
$day2->month = 1;
$day2->day = 11;

User::whereBetween('created_at', [$day1->startOfDay(), $day2->startOfDay()])->get();

上面的代码工作正常。 但是这种正常的方式,不会:

User::whereBetween('created_at', [$day1->startOfDay(), $day1->endOfDay()])->get();

我认为没有区别。

【问题讨论】:

    标签: php laravel eloquent php-carbon


    【解决方案1】:

    你不需要一个 between:

    $myDate = new Carbon('2016-01-10');
    User::whereDate('created_at', '=', $myDate->format('Y-m-d'))->get();
    

    【讨论】:

    • 感谢您的回复。但是按照你的代码,我得到这个:“Missing argument 3 for Illuminate\Database\Query\Builder::whereDate()”
    • 应该是whereDate('created_at', '=', $myDate),第二个参数必须是运算符,本例为=。
    • 没有更多错误。使用我的第一种方式,它将匹配 50 条记录。但与你的,没有匹配。那么我该如何解决这个问题呢? created_at 列是时间戳。
    • 感谢@Schellingerht,使用您的格式化代码,它可以工作。那么,您能否解释一下为什么我的第一个代码运行良好,但第二个代码却失败了?
    【解决方案2】:

    你可以使用类似他的东西

    \Illuminate\Database\Query\Builder Line 902
    
    User::whereDate('created_at', '=', new Carbon('2016-01-10'))->get();
    

    没有碳

    User::where( DB::raw('DATE(created_at)'), '=', '2016-01-10')->get();
    OR
    $d = new Carbon('2016-01-10');
    User::whereRaw('DATE(created_at) = ?', [$d])->get();
    

    【讨论】:

    • 感谢您的回复。我想用碳。但是使用您的代码,没有任何匹配项,即使我在那一天也有近 50 条记录。使用我的第一个代码,它可以工作,另一个不会。
    • 第一个使用where日期等于Carbon实例的条件如果列是DATETIME类型将不起作用。对于第二个,有一个辅助方法 whereDate 做同样的事情,但避免使用 @Schellingerht 在他的回答中指出的 DB::raw。
    • 是的。该列是时间戳,因此不适用于第一种方式。
    • User::where('created_at', '=', (new Carbon('2016-01-10'))->format('Ym-d'))->get() ;
    猜你喜欢
    • 2020-12-11
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    相关资源
    最近更新 更多