Php 查询在Laravel中未按预期工作
为了从特定时间段(上周、上月)获取条目,我的控制器中有以下代码:Php 查询在Laravel中未按预期工作,php,mysql,laravel,laravel-5.4,Php,Mysql,Laravel,Laravel 5.4,为了从特定时间段(上周、上月)获取条目,我的控制器中有以下代码: $data=Pedido::where([ ['sitio_id','=',$idSitio],['fechaPedido','>=','CURDATE()-INTERVAl '.$rango.' DAY'] ]) ->latest('fechaPedido') ->get(); echo json_
$data=Pedido::where([
['sitio_id','=',$idSitio],['fechaPedido','>=','CURDATE()-INTERVAl '.$rango.' DAY']
])
->latest('fechaPedido')
->get();
echo json_encode($data);
现在,当我在应用程序中执行它时,它返回表“Pedidos”中的所有条目,而不管我给它的时间间隔是多少天。也就是说,该网站自24天以来在Pedidos中没有新的条目,所以每周(7天)应该返回null
虽然当我对我的datqbase运行下面类似的SQL查询时,它工作得非常好
select * from `pedido` where (`sitio_d` = 1 and `fechaPedido` >= CURDATE()-INTERVAl 7 DAY) order by `fechaPedido` desc
当我在PHPMyAdmin中运行它时,它返回一个空结果,如果我在那里更改间隔,它将给出正确的输出
但在web应用程序中,它总是返回表中的所有条目,而不考虑时间间隔
尝试使用DB::raw处理它,但不管日期如何,它都会抛出一个空结果
这有什么原因不起作用吗?还是一种检查原始SQL数据并将其发送到数据库的方法
我使用的是Laravel 5.4和MySql,我想您的查询无法正常工作的原因是因为您需要转义
“CURDATE()-INTERVAl”。$rango。“DAY”
您可以使用DB::raw()
:
whereRaw
:
$data = Pedido::where('sitio_id', $idSitio)
->where('fechaPedido', '>=', DB::raw('CURDATE()-INTERVAl ' . $rango . ' DAY'))
->latest('fechaPedido')
->get();
$data = Pedido::where('sitio_id', $idSitio)
->whereRaw('fechaPedido >= CURDATE()-INTERVAl ' . $rango . ' DAY')
->latest('fechaPedido')
->get();
甚至只是用一个碳实例来传递日期
$data = Pedido::where('sitio_id', $idSitio)
->where('fechaPedido', '>=', \Carbon\Carbon::now()->subDays($rango)->startOfDay())
->latest('fechaPedido')
->get();
另外,在本例中,Eloquent将返回一个集合,这样您就可以执行$data->toJson()
,而不是json\u encode($data)
此外,如果您只想从路由
/Controller方法返回json,您只需执行返回$data
和Laravel将为您转换它
希望这有帮助 如果你做'dd(Pedido::where([['sitio_id','=','idstiti','fechaPedido','>=','CURDATE()-INTERVAl'.$rango.'DAY']]->latest('fechaPedido')->toSql()),你会得到什么;它通过
fechaPedido
desc返回“select*frompedido
where(sitio\u id
=?和fechaPedido
>=?)顺序”。这就是原始查询。谢谢谢谢这是没有问题的。另外,使用$data->toJson()而不是json_encode()是否有好处?@BrunoGutierrez我想说的唯一好处是它是可链接的,除此之外,没有任何额外的好处,因为它只是在幕后使用json_encode
。@BrunoGutierrez请注意使用db::raw()
和db::whereRaw()
将您置于SQL注入漏洞的范围内。确保在这种情况下使用的任何输入都被严格清理。在本例中,这将执行:whereRaw('fechaPedido>=CURDATE()-INTERVAL.(int)$rango.'DAY')
。出于这个原因,我建议使用最后一个示例:它使用准备好的查询,不易受到SQL注入的攻击。另外,使用Carbon
过滤用户输入。