使用 whereIn 方法 return 相同数组值但在不同索引处的多个结果
Using whereIn method to return multiple results for the same array value but at different index
$pidArray 包含产品 ID,其中一些产品 ID 可以相同。 I.E:34 34 56 77 99 34。实际上,whereIn 方法似乎不会 return 为它已经在 $pidArray 中找到的 productId 结果,即使它具有不同的索引。
$productDataForOrder = Product::whereIn('id', $pidArray)->get(['id','price']);
$totalAmount = $productDataForOrder->sum('price');
$productDataForOrder 现在包含产品数据,但仅限于 $pidarray 中的唯一 ProductID。所以当 sum 函数为 运行 时,求和是错误的,因为它没有考虑同一 productID 的多个实例的价格。
下面的代码也不return对象数组中的每个产品ID都是相同的。因此,如果 $pidArray 包含三个相同的产品 ID,则查询只会 return 一个包含一个对象的集合,而不是三个。
$query = Product::select();
foreach ($pidArray as $id)
{
$query->orWhere('id', '=', $id);
}
$productDataForOrder = $query->get(['id','price']);
$totalAmount = $productDataForOrder->sum('price');
whereIn 方法仅将结果限制为给定数组中的值。来自文档:
The whereIn method verifies that a given column's value is contained within the given array
我创建一个查询变量并循环遍历数组,在每次传递中添加到查询变量。像这样:
$query = Product::select();
foreach ($pidArray as $id)
{
$query->where('id', '=', $id);
}
$query->get(['id','price']);
您将无法按照您尝试的方式获取重复数据。 SQL 是 returning 与您的 where 子句匹配的行。它不会 return 重复行只是因为你的 where 子句有重复的 ids。
这样想可能会有所帮助:
select * from products where id in (1, 1)
与
相同
select * from products where (id = 1) or (id = 1)
table中只有一条记录满足条件,所以这就是你要得到的全部。
您将不得不在 PHP 中进行一些额外的处理才能获得您的价格。你可以这样做:
// First, get the prices. Then, loop over the ids and total up the
// prices for each id.
// lists returns a Collection of key => value pairs.
// First parameter (price) is the value.
// Second parameter (id) is the key.
$prices = Product::whereIn('id', $pidArray)->lists('price', 'id');
// I used array_walk, but you could use a plain foreach instead.
// Or, if $pidArray is actually a Collection, you could use
// $pidArray->each(function ...)
$total = 0;
array_walk($pidArray, function($value) use (&$total, $prices) {
$total += $prices->get($value, 0);
});
echo $total;
这是一个适用于您在@patricus 上扩展的用例的代码
您首先从产品 table
中获取一组键作为 id 和值作为价格
$prices = Product::whereIn('id', $pidArray)->lists('price', 'id');
$totalPrice = collect([$pidArray])->reduce(function($result, $id) use ($prices) {
return $result += $prices[$id];
}, 0);
$pidArray 包含产品 ID,其中一些产品 ID 可以相同。 I.E:34 34 56 77 99 34。实际上,whereIn 方法似乎不会 return 为它已经在 $pidArray 中找到的 productId 结果,即使它具有不同的索引。
$productDataForOrder = Product::whereIn('id', $pidArray)->get(['id','price']);
$totalAmount = $productDataForOrder->sum('price');
$productDataForOrder 现在包含产品数据,但仅限于 $pidarray 中的唯一 ProductID。所以当 sum 函数为 运行 时,求和是错误的,因为它没有考虑同一 productID 的多个实例的价格。
下面的代码也不return对象数组中的每个产品ID都是相同的。因此,如果 $pidArray 包含三个相同的产品 ID,则查询只会 return 一个包含一个对象的集合,而不是三个。
$query = Product::select();
foreach ($pidArray as $id)
{
$query->orWhere('id', '=', $id);
}
$productDataForOrder = $query->get(['id','price']);
$totalAmount = $productDataForOrder->sum('price');
whereIn 方法仅将结果限制为给定数组中的值。来自文档:
The whereIn method verifies that a given column's value is contained within the given array
我创建一个查询变量并循环遍历数组,在每次传递中添加到查询变量。像这样:
$query = Product::select();
foreach ($pidArray as $id)
{
$query->where('id', '=', $id);
}
$query->get(['id','price']);
您将无法按照您尝试的方式获取重复数据。 SQL 是 returning 与您的 where 子句匹配的行。它不会 return 重复行只是因为你的 where 子句有重复的 ids。
这样想可能会有所帮助:
select * from products where id in (1, 1)
与
相同select * from products where (id = 1) or (id = 1)
table中只有一条记录满足条件,所以这就是你要得到的全部。
您将不得不在 PHP 中进行一些额外的处理才能获得您的价格。你可以这样做:
// First, get the prices. Then, loop over the ids and total up the
// prices for each id.
// lists returns a Collection of key => value pairs.
// First parameter (price) is the value.
// Second parameter (id) is the key.
$prices = Product::whereIn('id', $pidArray)->lists('price', 'id');
// I used array_walk, but you could use a plain foreach instead.
// Or, if $pidArray is actually a Collection, you could use
// $pidArray->each(function ...)
$total = 0;
array_walk($pidArray, function($value) use (&$total, $prices) {
$total += $prices->get($value, 0);
});
echo $total;
这是一个适用于您在@patricus 上扩展的用例的代码 您首先从产品 table
中获取一组键作为 id 和值作为价格$prices = Product::whereIn('id', $pidArray)->lists('price', 'id');
$totalPrice = collect([$pidArray])->reduce(function($result, $id) use ($prices) {
return $result += $prices[$id];
}, 0);