我正在使用Laravel 5.2开发一个php项目。在我的应用程序中,我使用手动查询从数据库中检索记录。但我在使用csv中的where语句检索记录时遇到问题。请检查下面的方案。
示例我如何检索
$csv = "1,3,5";
$sql = "SELECT * FROM `items` WHERE `id` IN (?)";
$rows = DB::select($sql,[$csv]);
如上所示我正在检索三行。但它只返回id
为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);