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']);
延迟加载将查询您集合中的每个元素。相反,预加载将以相当快的方式执行它,在少量查询中提供您需要的所有数据。
下面的代码在 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']);
延迟加载将查询您集合中的每个元素。相反,预加载将以相当快的方式执行它,在少量查询中提供您需要的所有数据。