从Laravel的集合中获取特定的雄辩对象

时间:2017-12-13 20:31:54

标签: php 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);
}

这给了我一个带有可以随身携带物品的盒子的系列。

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

这是我被困的地方。我试过用冰球:

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文档。

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

3 个答案:

答案 0 :(得分:2)

您正在寻找first()方法。

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

或者,如果您重新使用get_possible_boxes()方法返回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查询的一部分来挤出更多的性能,而不是在你返回所有框后过滤集合,但我把它留给了你。

答案 1 :(得分:1)

你想要的可能是filter

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

if($valid_box)...

我应该注意,如果您不希望$valid_box成为一个集合,那么您可以使用first而不是filter以完全相同的方式来获取对象回来。

答案 2 :(得分:1)

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

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

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