php - usar - wherein laravel eloquent
Como consultar entre duas datas usando Laravel e Eloquent ORM? (6)
Estou tentando criar uma página de relatório que mostra relatórios de uma data específica para uma data específica. Aqui está o meu código atual:
$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', $now)->get();
O que isso faz em SQL simples é
select * from table where reservation_from = $now
.
Eu tenho essa consulta aqui, mas não sei como convertê-la em consulta eloquente.
SELECT * FROM table WHERE reservation_from BETWEEN '$from' AND '$to
Como posso converter o código acima para consulta eloquente? Agradeço antecipadamente.
E eu criei o escopo do modelo
Mais sobre escopos:
Código:
/**
* Scope a query to only include the last n days records
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeWhereDateBetween($query,$fieldName,$fromDate,$todate)
{
return $query->whereDate($fieldName,'>=',$fromDate)->whereDate($fieldName,'<=',$todate);
}
E no controlador, adicione a Biblioteca de Carbono ao topo
use Carbon\Carbon;
OU
use Illuminate\Support\Carbon;
Para obter os últimos 10 dias, grave a partir de agora
$lastTenDaysRecord = ModelName::whereDateBetween('created_at',(new Carbon)->subDays(10)->toDateString(),(new Carbon)->now()->toDateString() )->get();
Para obter os últimos 30 dias, grave a partir de agora
$lastTenDaysRecord = ModelName::whereDateBetween('created_at',(new Carbon)->subDays(30)->toDateString(),(new Carbon)->now()->toDateString() )->get();
Eu sei que isso pode ser uma pergunta antiga, mas acabei encontrando-me em uma situação onde eu tive que implementar esse recurso em um aplicativo do Laravel 5.7. Abaixo está o que funcionou de mim.
$articles = Articles::where("created_at",">", Carbon::now()->subMonths(3))->get();
Você também precisará usar Carbon
use Carbon\Carbon;
Outra opção se o seu campo for
datetime
vez de
date
(
embora funcione para ambos os casos
):
$fromDate = "2016-10-01";
$toDate = "2016-10-31";
$reservations = Reservation::whereRaw("reservation_from >= ? AND reservation_from <= ?",
array($fromDate." 00:00:00", $toDate." 23:59:59")
)->get();
Se você precisa ter em quando um campo de data e hora deve ser assim.
return $this->getModel()->whereBetween('created_at', [$dateStart." 00:00:00",$dateEnd." 23:59:59"])->get();
Tente isto:
Como você está buscando com base em um único valor de coluna, você pode simplificar sua consulta da mesma forma:
$reservations = Reservation::whereBetween('reservation_from', array($from, $to))->get();
Recuperar com base na condição: laravel docs
Espero que isso tenha ajudado.
O método
whereBetween
verifica se o valor de uma coluna está entre dois valores.
$from = date('2018-01-01');
$to = date('2018-05-02');
Reservation::whereBetween('reservation_from', [$from, $to])->get();
Em alguns casos, você precisa adicionar o período dinamicamente. Com base no comentário de @Anovative você pode fazer isso:
Reservation::all()->filter(function($item) {
if (Carbon::now->between($item->from, $item->to) {
return $item;
}
});
Se você gostaria de adicionar mais condições, então você pode usar
orWhereBetween
.
Se você quiser excluir um intervalo de datas, use
whereNotBetween
.
Reservation::whereBetween('reservation_from', [$from1, $to1])
->orWhereBetween('reservation_to', [$from2, $to2])
->whereNotBetween('reservation_to', [$from3, $to3])
->get();
Outras cláusulas where úteis:
whereIn
,
whereNotIn
,
whereNull
,
whereNotNull
,
whereDate
,
whereMonth
,
whereDay
,
whereYear
,
whereTime
,
whereColumn
,
whereExists
,
whereRaw
.