使用Laravel的MySQL IN语句

使用Laravel的MySQL IN语句,mysql,laravel,Mysql,Laravel,我让用户在我的视图中填写每年的复选框,以便他们可以根据所选年份进行查询。查询正在查找介于最小值和最大值之间的pH值。 正如你所看到的,可以选择不同的年份 查看 @foreach($years as $year) {{ Form::checkbox('selectedYears[]', $year->year) }} {{ $year->year }} @endforeach 在我的控制器中,我有如下内容: 控制器 $implodeYears

我让用户在我的视图中填写每年的复选框,以便他们可以根据所选年份进行查询。查询正在查找介于最小值和最大值之间的pH值。 正如你所看到的,可以选择不同的年份

查看

    @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。