Laravel Eloquent comparer la date du champ datetime

je veux obtenir toutes les lignes d'une table à l'aide d'une expression:

table.date <= 2014-07-10

Mais si la colonne contient un datetime disons:

2014-07-10 12:00:00

Mais si je fais:

where('date', '<=', $date)

il n'obtiendra pas la rangée.

je suppose que c'est parce que $date = 2014-07-10 ce qui fait MySQL supposer qu'il est 2014-07-10 00:00:00.

régulièrement MySQL, je voudrais juste faire

where DATE(date) <= $date

quel serait l'équivalent d'utiliser L'éloquent de Laravel?

22
demandé sur SidOfc 2014-08-05 17:23:44

5 réponses

Laravel 4+ vous propose ces méthodes: whereDay(), whereMonth(),whereYear() (n ° 3946 et whereDate() (n ° 6879).

ils font le SQL DATE() travailler pour vous, et gérer les différences de SQLite.

votre résultat peut être atteint comme suit:

->whereDate('date', '<=', '2014-07-10')

Pour plus d'exemples, voir le premier message de n ° 3946 et Laravel Quotidien de l'article.



mise à Jour: Si la méthode ci-dessus est commode, comme noté par Arth il est inefficace sur les grands ensembles de données, parce que le DATE() la fonction SQL doit être appliquée sur chaque enregistrement, écartant ainsi l'index possible.

Voici quelques façons de faire la comparaison (mais s'il vous plaît lire les notes ci-dessous):

->where('date', '<=', '2014-07-10 23:59:59')

->where('date', '<', '2014-07-11')

// '2014-07-11'
$dayAfter = (new DateTime('2014-07-10'))->modify('+1 day')->format('Y-m-d');

->where('date', '<', $dayAfter)

Notes:

  • 23:59:59 est d'accord (pour l'instant) en raison de la 1-précision de seconde, mais jetez un oeil à cet article: 23:59:59 n'est pas la fin de la journée. Aucun, vraiment!
  • Gardez à l'esprit le "zéro jour" cas ("0000-00-00 00:00:00"). Cependant, ces" dates zéro " devraient être évitées, elles sont la source de tant de problèmes. Il vaut mieux rendre le champ nul si nécessaire.
34
répondu Gras Double 2018-07-04 08:28:36

Avez-vous envisagé d'utiliser:

where('date', '<', '2014-08-11')

Vous devriez éviter d'utiliser le DATE() fonction sur les colonnes indexées dans MySQL, car cela empêche le moteur d'utiliser l'index.

UPDATE

comme il semble y avoir un certain désaccord sur l'importance de DATE() et l'index, j'ai créé un tripoter qui montre la différence, voir POSSIBLE KEYS.

6
répondu Arth 2018-07-04 09:21:32

Vous pouvez recevoir le record de la date '2016-07-14' en l'utilisant

 whereDate('date','=','2016-07-14')

Ou utiliser un autre code pour la dynamique de la date

whereDate('date',$date)
3
répondu Majbah Habib 2016-07-25 07:15:00

Vous pouvez utiliser ce

whereDate('date', '=', $date)

si vous donnez whereDate, comparez seulement la date du champ datetime.

1
répondu Jakir Hossain 2016-06-29 06:36:45

Si vous vous demandez toujours comment le résoudre.

j'utilise

$protected $dates = ['created_at','updated_at','aired'];

Dans mon modèle et mon où je ne

where('aired','>=',time())

il suffit donc d'utiliser unix pour comparer où.

dans les vues sur l'autre main, vous devez utiliser l'objet date.

J'espère que ça aidera quelqu'un!

0
répondu pixie_frigo 2017-10-28 13:28:48