1

$pidArray には製品 ID が含まれており、それらの製品 ID の一部は同じである可能性があります。IE: 34 34 56 77 99 34. このままでは、whereIn メソッドは、別のインデックスを持っていても、$pidArray で既に見つかった productId の結果を返さないようです。

 $productDataForOrder = Product::whereIn('id', $pidArray)->get(['id','price']);


 $totalAmount = $productDataForOrder->sum('price');

$productDataForOrder に製品データが含まれるようになりましたが、$pidarray 内の一意の ProductID についてのみです。そのため、sum 関数が実行されると、同じ productID の複数のインスタンスの価格が考慮されないため、合計は正しくありません。

次のコードも、配列内のすべての製品 ID に対して同じオブジェクトを返すわけではありません。したがって、$pidArray に 3 つの同一の製品 ID が含まれている場合、クエリは 3 つではなく、1 つのオブジェクトを含むコレクションのみを返します。

   $query = Product::select();
        foreach ($pidArray as $id)
        {
            $query->orWhere('id', '=', $id);
        }

        $productDataForOrder = $query->get(['id','price']);

        $totalAmount = $productDataForOrder->sum('price');
4

3 に答える 3

2

試みている方法で重複データを取得することはできません。SQL は、where 句に一致する行を返しています。where句に重複したIDがあるという理由だけで、重複した行を返すことはありません。

次のように考えると役立つかもしれません。

select * from products where id in (1, 1)

と同じです

select * from products where (id = 1) or (id = 1)

条件を満たすレコードはテーブル内に 1 つしかないため、取得するのはそれだけです。

価格を取得するには、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;
于 2016-04-11T06:29:37.883 に答える
0

whereIn メソッドは、結果を指定された配列の値にのみ制限します。ドキュメントから:

whereIn メソッドは、指定された列の値が指定された配列内に含まれていることを確認します。

クエリ変数を作成し、配列をループして、各パスでクエリ変数に追加します。このようなもの:

$query = Product::select();

foreach ($pidArray as $id)
{
    $query->where('id', '=', $id);
}

$query->get(['id','price']);
于 2016-04-10T05:19:20.867 に答える