我的数据库中有一个名为价格的表中有 2 个日期字段,分别是预订的开始时间和结束时间。
在我的控制器中使用以下变量,我得到这些字段:
use DB;
use Illuminate\Http\Request;
use App\Http\Requests;
public function MyFunction(Request $request){
$desde = "08:00:00";
$hasta = "23:00:00";
$now = new \DateTime();
$price = DB::table('precios')
->join('complejo', 'complejo.id', '=', 'precios.complejo_id')
->get();
return view('confirmar',['price'=>$price, 'now'=>$now]);
}
然后在视图中显示一个字段,它是预订价格的金额,如下所示:
<tr>
<td style="color: grey;">{{$prices->monto}}</td>
</tr>
现在我的问题来了,事实证明我不太清楚如何验证start_time和end_time字段是否在与当前时间一起验证的日期范围内。
也就是说,如果开始时间开始于19:00:00 Hrs
,结束时间结束于23:00:00 Hrs
,并且当前是下午 4:35:00,那么要显示的价格应该如下所示:
'TABLA precios'
id|monto|hora_inicio|hora_fin
1|20000|19:00:00 |23:00:00
2|23000|15:00:00 |19:00:00
3|18000|08:00:00 |13:00:00
在前面的例子中说,要显示的价格应该是23000,因为小时的范围是从15:00:00
到19:00:00 Hrs
,目前是16:35:00 Hrs。
但另一方面,这不会发生,它向我显示的价格始终是第一个小时的价格。15000 中的一个,在验证中,不花时间,这就是我试图让它工作的方式,这在我的控制器中:
$from = "08:00:00";
$now = Carbon::now();
$now->toTimeString();
$price = DB::table('precios')
->join('complejo', 'complejo.id', '=', 'precios.complejo_id')
->get();
//¿ES POSIBLE HACER ALGO SIMILAR COMO EN SQL?
/*EN SQL...
WHERE precio.hora_inicio AND precio.hora_fin
BETWEEN curTime() AND '17:00:00'*/
/*AHORA EN EL CONTROLADOR.
IF($price.hora_inicio && $price.hora_fin BETWEEN $now && '17:00:00')*/
/*ESTE ULTIMO (BETWEEN) REEMPLAZARLO POR UN OPERADOR QUE
REALICE LA MISMA FUNCION QUE BETWEEN EN SQL,
DE MOMENTO SE ME OCURRIÓ <= o >=*/
foreach ($price as $price) {
if ($price->hora_inicio && $price->hora_fin <= $now && '23:00:00') {
$valor = 23000;
}else if ($price->hora_inicio && $price->hora_fin <= $now && '17:00:00') {
$valor = 19000;
}else if ($price->hora_inicio && $price->hora_fin <= $now && '13:00:00') {
$valor = 15000;
}else{
$valor = 'No Aplica';
}
}
作为另一个示例,对数据库执行以下查询,获得预期结果。如果我更改了在查询中比较的系统时间,它每次都有效。
使用
date
如果你把它留下
Carbon
https://styde.net/componente-carbon-dates-laravel-5/的其他用途
Carbon
在 laravel 5.x 中,你可以这样做:
Laravel 会自动解析
carbon
并将其转换为string
. 您可以使用first
,因为您将始终拥有一个值,如果超出范围,它将返回null
. 访问 $price->amount;