从 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();
我有一个功能可以寻找可能携带物品的盒子。
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();