我有一个功能,可以查找可以随身携带文章的盒子。
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文档。
所以问题是,我如何获得正确的雄辩模型?
答案 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();