从 Laravel 中的 collection 中获取特定的 eloquent object

Getting a specific eloquent object out of a collection in Laravel

我有一个功能可以寻找可能携带物品的盒子。

public static function get_possible_boxes($article,$quantity)
{
    $i = 0;

    $possible_boxes = array();

    $total_weight = $articles->grams * $quantity;

    $boxes = Boxes::all();


    foreach($boxes as $box)
    {
        if($total_weight+ $box->grams < $box->max_weight)
        {
            $possible_boxes[$i] = $box;
            $i++;
        }
    }

        return collect($possible_boxes);
}

这给了我一个 collection 的盒子,可以装我的东西。

现在我应该检查客户选择的盒子的ID是否存在。如果不存在,它将选择第一个有效的。

这就是我卡住的地方。我试过使用 puck:

public function someotherfunction(){
...
$boxes = get_possible_boxes($something,$number);
$valid_box = $boxes->where("id", $request->selected_box)->pluck("id");
if(!$valid_box){
  $valid_box = $boxes[0]
}
...

如果无法使用所选框,此方法有效。函数 pluck 只给了我 id,显然它不是我要找的函数,我已经阅读了 Laravel 文档。

所以问题是,如何获得正确的 eloquent 模型?

你想要的大概是filter.

$valid_box = $boxes->filter(function($box) use ($request){
    return $box->id == $request->selected_box;
});

if($valid_box)...

我要注意,如果你不想 $valid_box 成为一个集合,你可以使用 first 而不是 filter 以完全相同的方式只获取对象返回。

您正在寻找 first() 方法。

$valid_box = $boxes->where("id", $request->selected_box)->first();

或者,如果您将 get_possible_boxes() 方法修改为 return 一个 Illuminate\Database\Eloquent\Collection 而不是普通的 Illuminate\Support\Collection,您可以使用 find() 方法,像这样:

函数:

public static function get_possible_boxes($article,$quantity)
{
    $total_weight = $article->grams * $quantity;

    $boxes = Boxes::all()->filter(function ($box) use ($total_weight) {
        return $total_weight + $box->grams < $box->max_weight;
    });

    return $boxes;
}

查找:

$boxes = get_possible_boxes($something, $number);
$valid_box = $boxes->find($request->selected_box) ?? $boxes->first();

而且,您可以通过将权重条件添加为 SQL 查询的一部分,而不是在 return 编辑完所有框后过滤集合,从而获得更多性能,但是我把它留给你了。

可以通过多种方式完成,但我宁愿使用以下方法:

$boxes = get_possible_boxes($something,$number)->keyBy('id');

$valid_box = $boxes->get($request->selected_box) ?: $boxes->first();