在Laravel原始查询中使用逗号分隔值的位置只返回一行

时间:2016-03-27 05:40:26

标签: laravel

我正在使用Laravel 5.2开发一个php项目。在我的应用程序中,我使用手动查询从数据库中检索记录。但我在使用csv中的where语句检索记录时遇到问题。请检查下面的方案。

  

示例我如何检索

$csv = "1,3,5";
$sql = "SELECT * FROM `items` WHERE `id` IN (?)";
$rows = DB::select($sql,[$csv]);

如上所示我正在检索三行。但它只返回id为1的一行。为什么?那么我该如何解决呢?我该怎么办?

1 个答案:

答案 0 :(得分:1)

你不能这样做。 csv中的每个条目都是一个单独的参数,因此对于您的代码,您实际需要IN (?, ?, ?),然后传入值数组。编写执行此操作的代码非常容易(将字符串分解为数组,创建另一个相同大小的问号数组,将它们放在一起)。

但是,您使用的是Laravel,因此使用Laravel为您提供的功能会更容易。

使用查询构建器,您可以这样做:

$csv = "1,3,5";

// turn your csv into an array
$ids = explode(",", $csv);

// get the data
$rows = DB::table('items')->whereIn('id', $ids)->get();

// $rows will be an array of stdClass objects containing your results
dd($rows);

或者,如果您为Item表设置了items模型,则可以执行以下操作:

$items = Item::whereIn('id', $params)->get();

// $items will be a Collection of Item objects
dd($items);

或者,假设id是项目表的主键:

// find can take a single id, or an array of ids
$items = Item::find($params);

// $items will be a Collection of Item objects
dd($items);

修改

如果你真的想以手动的方式做,你可以使用循环,但你不需要。 PHP提供了一些非常方便的数组方法。

$csv = "1,3,5";

// turn your csv into an array
$ids = explode(",", $csv);

// generate the number of parameters you need
$markers = array_fill(0, count($ids), '?');

// write your sql
$sql = "SELECT * FROM `items` WHERE `id` IN (".implode(',', $markers).")";

// get your data
$rows = DB::select($sql, $ids);