Laravel 的 collection,你需要避免踩坑

Laravel 中 collection 有两个类

  • Illuminate\Support\Collection
  • Illuminate\Database\Eloquent\Collection

如果你用 collect($array) 方法,和 new Illuminate\Support\Collection($array) 的效果是一样的。

我今天在使用 Illuminate\Database\Eloquent\Collection 就踩了这个坑:

$collection = new \Illuminate\Database\Eloquent\Collection(['item a', 'item b', 'item c']);
$collection = $collection->unique();

执行时候会报错

PHP Fatal error:  Call to a member function getKey() on string in /Project/nginx/webbpm-dev.ssl.lol/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php on line 259

  [Symfony\Component\Debug\Exception\FatalErrorException]
  Call to a member function getKey() on string

这是因为 Illuminate\Database\Eloquent\Collection 通过调用自身的 getDictionary 方法,使用根据主键去重复的逻辑覆盖了 Illuminate\Support\Collection 的逻辑。

以上代码改成

$collection = collect(['item a', 'item b', 'item c']);
$collection = $collection->unique();

就好了

www.anquanssl.com 安全SSL
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
LOST

之前也犯过类似的错误,归根结蒂,是没搞清楚当前要处理的对象究竟是哪个类型的集合。

6年前 评论

Illuminate\Database\Eloquent\Collection 是 集合的子类,
也就是 ORM 的get()方法返回的对象

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!