Je veux obtenir toutes les lignes d'une table à travers une expression:
table.date <= 2014-07-10
Mais si la colonne contient un datetime, disons:
2014-07-10 12:00:00
Mais si je le fais:
where('date', '<=', $date)
ça ne va pas avoir le rang.
J'imagine que c'est parce que $ date = 2014-07-10, ce qui fait supposer à MySQL qu'il s'agit du 2014-07-10 00:00:00.
Dans MySQL régulier, je voudrais juste faire
where DATE(date) <= $date
Quel serait l'équivalent en utilisant Eloquent de Laravel?
Laravel 4+ vous propose les méthodes suivantes: whereDay()
, whereMonth()
, whereYear()
( # 3946 ) et whereDate()
( # 6879 ).
Ils font le travail DATE()
SQL pour vous, et gèrent 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 # 3946 et ceci Article de Laravel Daily .
Update: Bien que la méthode ci-dessus soit pratique, comme l'a noté Arth, elle est inefficace sur les grands ensembles de données, car la fonction DATE()
SQL doit être appliquée sur chaque enregistrement, écartant ainsi l'index possible.
Voici quelques façons de faire la comparaison (mais veuillez 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)
Remarques:
Avez-vous envisagé d'utiliser:
where('date', '<', '2014-08-11')
Vous devriez éviter d'utiliser la fonction DATE()
sur les colonnes indexées dans MySQL, car cela empêcherait le moteur d'utiliser l'index.
METTRE &AGRAVE; JOUR
Comme il semble y avoir un désaccord sur l’importance de DATE()
et des index, j’ai créé un violon qui démontre la différence, voir POSSIBLE KEYS
.
Vous pouvez obtenir le tout enregistrement de la date '2016-07-14' en l'utilisant
whereDate('date','=','2016-07-14')
Ou utilisez un autre code pour la date dynamique
whereDate('date',$date)
Vous pouvez utiliser ceci
whereDate('date', '=', $date)
Si vous indiquez whereDate, comparez uniquement le champ date/date.