laravel 中 map() 的 excat 功能是什么?

what is excat functionality of map() in laravel?

我正在从数据库中获取数据,然后向该数据添加一个属性。为此,我在这个函数中使用了 map(),因为我使用的是具有 5 值的 $qty 变量。 然后我将在下一次迭代中降低它的价值,但不幸的是,这并没有发生

    $qty = $request->product_qty;
    $searchProducts->map(function ($product) use ($qty) {
        $qty_taken = $qty - $product->free_qty;
        $product->setAttribute('qty_taken',$qty);
        $qty = $qty - $product->free_qty;
        return $product;
    });

我认为每次 map() 都在提供值 5 map 不会让逻辑减少其值。

map() 方法迭代 collection 和 returns 一个新的 collection 由从传递给 map() 的闭包返回的项目组成。

由于您没有尝试生成新的 collection,因此 map() 不是您要查找的内容。您只是尝试遍历 collection 并使用每个项目执行一些操作。为此,您将使用 each() 方法。或者,您可以使用简单的 foreach 循环。

您的 $qty 变量未更新的原因是,就像函数参数一样,use 参数默认按值传递。如果您希望对 $qty 变量的更改在迭代中持续存在,则需要通过引用传递它(在变量前加上 & 符号 (&))。

因此,要修复您的代码,有两种选择。

要继续使用 collection 方法,请切换到 each() 并通过引用传递(注意 & 符号):

$qty = $request->product_qty;
$searchProducts->each(function ($product) use (&$qty) {
    $qty_taken = $qty - $product->free_qty;
    $product->setAttribute('qty_taken', $qty);
    $qty = $qty - $product->free_qty;
});

您也可以只使用普通的 PHP foreach,这样您就不必担心 $qty 变量的范围,因为它都是本地的。

$qty = $request->product_qty;
foreach ($searchProducts as $product) {
    $qty_taken = $qty - $product->free_qty;
    $product->setAttribute('qty_taken', $qty);
    $qty = $qty - $product->free_qty;
});