【Laravel】9. 集合与模型

198 阅读2分钟

作者:拾年之璐   公众号:知行研究院

9.1 创建与使用集合

什么是集合?

它是一种更具读取性和处理能力的数组封装。

比如,我们从数据库得到的数据列表,它就是一种集合;我们可以对这个返回的集合,进行各种操作。

$users = User::get();
dd($users);

输出结果我们可以看出,为集合:

Illuminate\Database\Eloquent\Collection {
    ......
}

除了数据库对象返回的数据集合之外,我们还可以自行创建数据集合:

//创建一个数据集合
$collection = collect(['张三', '李四', '王五', null]);

//使用 dd 查看它的类型
dd($collection);

//直接 return 可以返回
return $collection;

9.2 集合的常用方法

数据集合提供了大量的处理数据集合的方法,可链式调用。

数据集合的常用方法有数百个,篇幅有限,请见文末附录。

9.3 扩展集合

集合都是可宏扩展(macroable) 的,它允许你在执行时将其它方法添加到 Collection 类。例如,通过下面的代码在 Collection 类中添加一个 toUpper 方法:

use Illuminate\Support\Collection;
use Illuminate\Support\Str;

Collection::macro('toUpper', function () {
    return $this->map(function ($value) {
        return Str::upper($value);
    });
});

$collection = collect(['first', 'second']);

$upper = $collection->toUpper();

//输出结果: ['FIRST', 'SECOND']

9.4 模型的数据集合

数据集合,就是已经将模型方法get()获取到的数据再进行处理。

首先,进行普通查询,得到的是一个集合:

$users = User::get();

然后可以对该 $users 集合进行再处理。示例如下:

1、map()方法,通过它可以实现类似访问器一样对字段进行处理的效果

//使用集合方法map 可以对输出的字段进行过滤
$users2 = $users->map(function ($user) {
    $user->email = strtoupper($user->email);//转换成大写字母
    return $user;
});
return [$users2];

最终输出的结果,邮箱全是大写的。

2、reject() 方法,可以获取条件之外的数据内容;

$women = $users->reject(function ($user) {
    return $user->gender != '女';
})->map(function ($user) {
    return $user;
});
return [$women];

最终输出的结果,只包含gender=女 的数据。

3、其他常用的集合方法列表:

//判断集合中是否包含指定的模型实例
return $users->contains(19);
return $users->contains(User::find(19));

//返回不在集合中的所有模型
return $users->diff(User::whereIn('id', [19,20,21])->get());

//返回给定主键外的所有模型
return $users->except([19,20,21]);

//集合也有find 方法
return $users->find(19);

//返回集合的数量
return $users->count();

//返回所有模型的主键
return $users->modelKeys();

//返回主键的所有模型
return $users->only([19,20,21]);

//返回集合中的唯一模型
return $users->unique();

其实这些方法,也是下面这些。可以参考附录。

9.5 附:集合的常用方法

下面将对一些常用的方法进行演示。

整理自:learnku.com/docs/larave…

1、all() all方法:返回代表集合的底层数组

示例:

collect([1, 2, 3])->all();
// [1, 2, 3]

2、avg() 或average()

average 是 avg 方法的别名。

avg 方法:返回键的 平均值

$average = collect([['foo' => 10], ['foo' => 10], ['foo' => 20], ['foo' => 40]])->avg('foo');
// 20

$average = collect([1, 1, 2, 4])->avg();
// 2

3、chunk()

chunk 方法把集合分割成多个指定大小的较小集合:

$collection = collect([1, 2, 3, 4, 5, 6, 7]);
$chunks = $collection->chunk(4);
$chunks->all();
// [[1, 2, 3, 4], [5, 6, 7]]

当使用如 Bootstrap那样的栅格系统时,该方法在 视图 中相当有用。想象一下你有个想在栅格显示的 Eloquent 模型:

@foreach ($products->chunk(3) as $chunk)
    <div class="row">
        @foreach ($chunk as $product)
            <div class="col-xs-4">{{ $product->name }}</div>
        @endforeach
    </div>
@endforeach

还有更多的集合关键字,如下所示:

  • chunkWhile
  • collapse
  • collect
  • combine
  • concat
  • contains
  • containsStrict
  • count
  • countBy
  • crossJoin
  • dd
  • diff
  • diffAssoc
  • diffKeys
  • dump
  • duplicates
  • duplicatesStrict
  • each
  • eachSpread
  • every
  • except
  • filter
  • first
  • firstWhere
  • flatMap
  • flatten
  • flip
  • forget
  • forPage
  • get
  • groupBy
  • has
  • implode
  • intersect
  • intersectByKeys
  • isEmpty
  • isNotEmpty
  • join
  • keyBy
  • keys
  • last
  • macro
  • make
  • map
  • mapInto
  • mapSpread
  • mapToGroups
  • mapWithKeys
  • max
  • median
  • merge
  • mergeRecursive
  • min
  • mode
  • nth
  • only
  • pad
  • partition
  • pipe
  • pipeInto
  • pluck
  • pop
  • prepend
  • pull
  • push
  • put
  • random
  • reduce
  • reject
  • replace
  • replaceRecursive
  • reverse
  • search
  • shift
  • shuffle
  • skip
  • skipUntil
  • skipWhile
  • slice
  • some
  • sort
  • sortBy
  • sortByDesc
  • sortDesc
  • sortKeys
  • sortKeysDesc
  • splice
  • split
  • splitIn
  • sum
  • take
  • takeUntil
  • takeWhile
  • tap
  • times
  • toArray
  • toJson
  • transform
  • union
  • unique
  • uniqueStrict
  • unless
  • unlessEmpty
  • unlessNotEmpty
  • unwrap
  • values
  • when
  • whenEmpty
  • whenNotEmpty
  • where
  • whereStrict
  • whereBetween
  • whereIn
  • whereInStrict
  • whereInstanceOf
  • whereNotBetween
  • whereNotIn
  • whereNotInStrict
  • whereNotNull
  • whereNull
  • wrap
  • zip

以上。