Laravel eloquent получит модель на дату

Я хочу, чтобы все пользователи были созданы в указанную дату:

// $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 результатов, тогда как в базе данных есть строки, соответствующие этой дате.

Что я делаю не так?

Carbon не ведет себя как объект ценности (т. Е. Он не является неизменным), поэтому это:

 $date->startOfDay(); $date->endOfDay(); - $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 метку xxxx-xx-xx 23:59:59 , поэтому имейте это в виду, если вам нужно работать с этой переменной где-то в другом месте.

Проблема здесь вовсе не в 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(); 

В вашем запросе осталось имя таблицы:

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

Посмотрите: http://laravel.com/docs/4.2/queries#selects