从laravel集合中只获取一个数据似乎很难

时间:2017-03-30 11:19:56

标签: php laravel collections

我没有得到这个,我收集了一些物品。 在这种情况下,该集合包含索引1中的一个且仅一个项目,因为它是从较大的集合中过滤的。 关键是我如何获得我需要的唯一数据而不必重置索引的值然后在索引0处访问? 这种情况下我总是只有一个项目,但索引可能不同,所以默认情况下我不能使用[0]索引。

//returns all items with 'item_color_id" = 1

$item = Item::where(//some constraints);

$filtered = $item->filter(function ($i) {
                return $i->item_color_id == 1;
            });

if (count($filtered)) {

    //need to access a single data inside the collection
    // like for example 'item_brand_id'
    //I can do it like this:

    $filtered = $filtered->values();

    $item_brand_id = $filtered[0]['item_brand_id'];

    //but what sense does it have?? how can we access 'item_brand_id'
    //from $filtered without resetting the indexes?

}

对我来说没有任何意义,我们没有直接访问数据的方法,或者如果我们拥有它,我就错过了它。 例如,我可以在$ filter上使用max()或min(),如下所示:

$max_brand_id = $filtered->max('item_brand_id');

在我知道的情况下找到最大id没有任何意义,但它表明我们可以在一个段落中找到数据。 我尝试only('item_brand_id);,但在数据存在时返回空。

3 个答案:

答案 0 :(得分:0)

当你想要一组匹配元素时,使用

filter(),即使这只会产生一个元素。

如果您知道只需要一个与真值测试匹配的元素,请改用first()。它有相同的签名。

Item::where(...)->get()->first(function ($item) {
    return $item->item_color_id == 1;
})->get('item_brand_id');

答案 1 :(得分:0)

您可以将数据库查询更改为仅返回一个元素。如果结果总是只有一个,则无需加载整个集合。

$item = Item::where(/*some constraints*/)->where('item_color_id', 1)->first();
if (isset($item))
    echo $item->item_brand_id;

答案 2 :(得分:0)

你还有eloquent collection,所以你可以只调用first()函数

$item_brand_id = $filtered->first()->item_brand_id;