laravel pluck 5.2 与 5.1 不同

laravel pluck 5.2 not works as in 5.1

下面的代码在 5.1 中工作,它是延迟加载徽标。但是现在它尝试调用 Collection 上的 load 方法。

$campaigns = Campaign::all();
$campaigns->pluck('brand')->load('logo');

错误

in Macroable.php line 81
at Collection->__call('load', array('logo')) in HomeController.php line 84
at Collection->load('logo') in HomeController.php line 84
at HomeController->index(object(Request))

5.1 关系错误

in Builder.php line 2071
at Builder->__call('logo1', array())
at Builder->logo1()
at call_user_func_array(array(object(Builder), 'logo1'), array()) in Builder.php line 943
at Builder->__call('logo1', array())
at Builder->logo1()
at call_user_func_array(array(object(Builder), 'logo1'), array()) in Model.php line 3483
at Model->__call('logo1', array()) in Builder.php line 477
at Brand->logo1() in Builder.php line 477
at Builder->Illuminate\Database\Eloquent\{closure}()
at call_user_func(object(Closure)) in Relation.php line 171
at Relation::noConstraints(object(Closure)) in Builder.php line 478
at Builder->getRelation('logo1') in Builder.php line 449
at Builder->loadRelation(array(object(Brand), object(Brand), object(Brand), object(Brand), object(Brand), object(Brand), object(Brand)), 'logo1', object(Closure)) in Builder.php line 429
at Builder->eagerLoadRelations(array(object(Brand), object(Brand), object(Brand), object(Brand), object(Brand), object(Brand), object(Brand))) in Collection.php line 44
at Collection->load('logo1') in HomeController.php line 82

发现它是 Illuminate\Database\Eloquent\Collection 现在 Illuminate\Support\Collection。

如何将其转换为 Eloquent?

使用 pluck 结果初始化一个新的 Eloquent 集合,它再次工作。希望有更好的解决办法。

    $b = new \Illuminate\Database\Eloquent\Collection($campaigns->pluck('brand'));
    $b->load('logo');

您应该查看 Laravel 文档 here:如介绍说明中所述

Note: While most Eloquent collection methods return a new instance of an Eloquent collection, the pluck, keys, zip, collapse, flatten and flip methods return a base collection instance.

Eloquent 集合只是 Illuminate\Support\Collection 的扩展。在 Eloquent 集合中,构造函数没有被覆盖,因此,检查 Base Controller 构造函数,我们可以假设您可以使用这种类型/实例创建一个 Eloquent 集合(或一个新的 Base 集合):

  • 数组
  • 集合(self的实例)
  • 可排列(实例)
  • Jsonable(实例)
  • JsonSerializable(实例)

您可以将集合 class 的 __construct 方法检查到您的 vendor 文件夹中,进入 laravel\framework\Illuminate\Support\Collection.php 然后搜索对于在构造函数中调用的 getArrayableItems 方法。

以我的愚见,从 "base" 集合创建 Eloquent 集合是非常无用的,因为您将丢失对数据库的引用,并且您将无法直接使用它结果集了。事实上,您不会有 id 或任何主键来让您在数据库中识别精确的行(除非您提取的数据是主键)。无论如何,您可以实例化一个新的 Eloquent 集合,在构造函数中传递 "base" 集合:

$baseCollection = new \Illuminate\Support\Collection();
$eloquentCollection = new \Illuminate\Database\Eloquent\Collection($baseCollection);

此外,使用 Campaign::all() 您可以从 table 中获取所有列。你为什么不

Campaign::with('logo')->get(['id', 'brand']);

延迟加载将查询您集合中的每个元素。相反,预加载将以相当快的方式执行它,在少量查询中提供您需要的所有数据。