0

我想在指定日期创建所有用户:

// $date is a Carbon instance parsed from command line argument.
// I checked it and it is correct.

$users = User::where('created_at', '>', $date->startOfDay())
    ->where('created_at', '<', $date->endOfDay())
    ->get();

但这会返回 0 个结果,而在数据库中有对应于该日期的行。

我究竟做错了什么?

4

3 回答 3

2

Carbon不像值对象(即它不是不可变的),所以这个:

$date->startOfDay();
$date->endOfDay();

只需修改$date对象并将其返回。话虽如此,传递给查询的字符串是PDO在准备好的语句中绑定它时获得的,当$date它已经突变为endOfDay.

这意味着您只需传递对对象的引用:

$start === $end; // true

所以要么使用不同的对象:

$users = User::where('created_at', '>', $date->copy()->startOfDay())
  ->where('created_at', '<', $date->copy()->endOfDay())
  ->get();

或者简单地返回您需要的字符串,而不是Carbon对象:

$users = User::where('created_at', '>', $date->startOfDay()->toDateTimeString())
  ->where('created_at', '<', $date->endOfDay()->toDateTimeString())
  ->get();

仍然,$date现在将保留xxxx-xx-xx 23:59:59时间戳,因此请记住这一点,以防您需要在其他地方使用此变量。

于 2014-10-07T15:44:27.403 回答
1

问题不在于 Laravel 本身,而在于 Carbon。

使用以下代码时:

use Carbon\Carbon;
$date = new Carbon('2014-10-07');

$start = $date->startOfDay();

$end = $date->endOfDay();

echo $start.' '.$end;

你得到的是:

2014-10-07 23:59:59 2014-10-07 23:59:59

所以 Laravel 会执行查询:

select * from `users` where `created_at` >'2014-10-07 23:59:59' and `created_at` <'2014-10-07 23:59:59';

显然你不会得到任何结果。

如您所见,$start结果不是您在这里所期望的。

为了使它起作用,我发现的解决方案是创建 2 个碳对象:

use Carbon\Carbon;
$date = new Carbon('2014-10-07');
$date2 = new Carbon('2014-10-07');

$start = $date->startOfDay();

$end = $date2->endOfDay();

echo $start.' '.$end;

现在结果如预期:

2014-10-07 00:00:00 2014-10-07 23:59:59

现在您可以使用:

use Carbon\Carbon;
$date = new Carbon('2014-10-07');
$date2 = new Carbon('2014-10-07');

$users = User::where('created_at', '>', $date->startOfDay())
    ->where('created_at', '<', $date2->endOfDay())
    ->get();

或者

use Carbon\Carbon;
$date = new Carbon('2014-10-07');
$date2 = new Carbon('2014-10-07');

$users = User::whereBetween('created_at', [$date->startOfDay(), $date2->endOfDay()])->get();
于 2014-10-07T09:12:55.893 回答
0

在您的查询中留下了表名:

$users = DB::table('users')
                ->where('votes', '>', 100)
                ->orWhere('name', 'John')
                ->get();

看: http: //laravel.com/docs/4.2/queries#selects

于 2014-10-07T08:40:47.350 回答