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?
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.
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
.
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)
Vous pouvez utiliser ce
whereDate('date', '=', $date)
si vous donnez whereDate, comparez seulement la date du champ datetime.
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!