使用Laravel的MySQL IN语句
我让用户在我的视图中填写每年的复选框,以便他们可以根据所选年份进行查询。查询正在查找介于最小值和最大值之间的pH值。 正如你所看到的,可以选择不同的年份 查看使用Laravel的MySQL IN语句,mysql,laravel,Mysql,Laravel,我让用户在我的视图中填写每年的复选框,以便他们可以根据所选年份进行查询。查询正在查找介于最小值和最大值之间的pH值。 正如你所看到的,可以选择不同的年份 查看 @foreach($years as $year) {{ Form::checkbox('selectedYears[]', $year->year) }} {{ $year->year }} @endforeach 在我的控制器中,我有如下内容: 控制器 $implodeYears
@foreach($years as $year)
{{ Form::checkbox('selectedYears[]', $year->year) }} {{ $year->year }}
@endforeach
在我的控制器中,我有如下内容:
控制器
$implodeYears = implode(', ',$input['selectedYears']);
DB::select('SELECT samples.*, costumers.*
FROM samples
LEFT JOIN costumers
ON samples.costumer_id = costumers.id
WHERE
pH BETWEEN ? AND ?
AND YEAR IN ( ? )
Order BY Year DESC, samples.costumer_id DESC
', array(
$minph,
$maxph,
$implodeYears
));
DB::select('SELECT samples.*, costumers.*
FROM samples
LEFT JOIN costumers
ON samples.costumer_id = costumers.id
WHERE
pH BETWEEN ? AND ?
AND YEAR IN (2008, 2010, 2012)
Order BY Year DESC, samples.costumer_id DESC
', array(
$minph,
$maxph
));
我检查了我的变量,它看起来很好:
dd($implodeYears);
string(34) "2008, 2009, 2010, 2011, 2012, 2013"
问题是查询只返回字符串中的第一年。所以我知道这是一个字符串有点不对劲。
当我这样查询时,它运行良好:
控制器中的静态年份
$implodeYears = implode(', ',$input['selectedYears']);
DB::select('SELECT samples.*, costumers.*
FROM samples
LEFT JOIN costumers
ON samples.costumer_id = costumers.id
WHERE
pH BETWEEN ? AND ?
AND YEAR IN ( ? )
Order BY Year DESC, samples.costumer_id DESC
', array(
$minph,
$maxph,
$implodeYears
));
DB::select('SELECT samples.*, costumers.*
FROM samples
LEFT JOIN costumers
ON samples.costumer_id = costumers.id
WHERE
pH BETWEEN ? AND ?
AND YEAR IN (2008, 2010, 2012)
Order BY Year DESC, samples.costumer_id DESC
', array(
$minph,
$maxph
));
当我以前在没有Laravel的情况下工作时,这个查询工作得很好。这很奇怪,在那个版本中,当var_转储内爆变量时,我得到了相同的结果。结果如下
使用var_dump的标准MySQL查询的旧版本
有人能给我一个提示吗?
我是舒尔,对此有很好的解释。但我在谷歌上搜索了一段时间,却找不到它
谢谢,西蒙。我强烈建议你不要做那样的事。代码当前仅在第一年返回的原因是预先准备好的语句、误解和类型转换 当您执行正在执行的操作时,向服务器发出的SQL查询的where部分相当于:
YEAR IN ("2008, 2009, 2010...")
由于您的字段很可能是一个整数,MySQL试图理解/理解您发送的内容,并将其转换为:
YEAR IN (2008)
这就解释了你的第一个价值观
如何修复它
短版本是正确使用Laravel查询生成器。以下工作将起作用:
DB::table('samples')
->select('samples.*', 'costumers.*')
->join('costumers', 'samples.costumer_id', '=', 'costumers.id')
->whereIn("samples.year", $input['selectedYears'])
->where("samples.pH", ">=", $minph)
->where("samples.pH", "<=", $maxph)
->get();
DB::table('samples')
->选择('samples.*'、'customers.*')
->加入('customers','samples.customer_id','=','customers.id'))
->其中(“samples.year”,$input['selectedYears'])
->其中(“samples.pH”,“>=”,$minph)
->其中(“samples.pH”,“为什么先内爆然后爆炸?”此外,这只是查询生成器,没有说服力…@lukasgeiter在您发表评论之前更正了第2点。至于分解列表,我没有他的变量名。决定让它清楚地显示它应该是什么。请参阅您的代码突出显示:customers.id')
缺少起始引号:'customers.id')
@Luceos更正,谢谢!(下一次,不必再提了,只需编辑:-)等一下,现在似乎可以工作了!谢谢!这是更好的解决方案。我现在使用的是DB::table的最新代码,而不是DB::select。