我有一个带有多个参数的搜索功能,似乎每个参数上的每个时间都不起作用例如我用一个参数测试了搜索查询“etat_paiement = 0”,
normaly我应该没有结果,但我还有一个,但在数据库中这条记录有etat_paiement = 1
我犯了错误?非常感谢提前
这里是代码:
$query = EngagementOrder::query();
$filters = [
'structure_engagement_id' => 'structure_id',
'saison_id' => 'saison_id',
'etat_paiement' => 'etat_paiement',
'bl_comptabilite' => 'bl_comptabilite',
];
foreach ($filters as $key => $column) {
$query->when($request->{$key}, function ($query, $value) use ($column) {
$query->where($column, $value);
});
}
$engagements = $query->paginate(10);
在我的调试栏中,我有以下查询:
从engagement_order
限制10偏移0
但我使用url运行搜索:
https://mydomaine/engagements?etat_paiement=0
更新:这是我的选择框:
{!! Form::select('etat_paiement', array('1' => 'Facture Réglée' , '0' => 'Facture Non Rélgée') , null , ['class' => 'form-control select2 ', 'placeholder' => 'Selectionnez un type de réglement']) !!}
答案 0 :(得分:1)
问题在于laravel的when
方法。当你通过" 0"作为when
函数的第一个参数,下面的值调用为" 0",在这种情况下解析为false:if ($value)
public function when($value, $callback, $default = null)
{
if ($value) {
return $callback($this, $value) ?: $this;
} elseif ($default) {
return $default($this, $value) ?: $this;
}
return $this;
}
您可以生成如下查询:
,而不是使用when
foreach ($filters as $key => $column) {
if ($request->has($key)) {
$query->where($column, $request->{$key});
}
}
如果您想使用when
,请将代码更改为
foreach ($filters as $key => $column) {
$query->when($request->has($key), function ($query, $value) use ($column,$key, $request) {
$query->where($column, $request->$key);
});
}
答案 1 :(得分:0)
您可以尝试使用exists
代替$request->{$key}
,例如:
$request->exists($key)
在您的情况下,$request->{$key}
评估为false,因为etat_paiement=0
有假值。另一方面,exists
将检查查询参数/ $key
是否存在,无论其值如何。