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();

就好了

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3
LOST

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

5年前 评论

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

5年前 评论

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