我有一个包含Model对象数组的收集对象,我想从模型中选择特定字段。
Illuminate\Database\Eloquent\Collection Object
(
[items:protected] => Array
(
[0] => App\Model Object
[1] => App\Model Object
[2] => App\Model Object
)
)
现在,我想从模型对象中选择一些字段。当我尝试执行以下语法
print_r($collection->select('filed a', 'field b'));
然后发生以下错误。
Macroable.php第74行中的BadMethodCallException:方法选择确实 不存在。
我认为select可以直接与雄辩的模型一起工作,而不能与集合一起工作。
答案 0 :(得分:0)
您是正确的select is not present on the Collection class。
您可以做的是map, filter or transform the collection,例如
$whiteList = ['filed a', 'field b'];
$filledOnly = $collection->map(function ($item) use ($whiteList) {
$properties = get_object_vars($item);
foreach ($properties as $property) {
if(!in_array($property, $whiteList) {
unset($item->{property});
}
}
return $item;
});
问题出在PHP中,一旦在对象上设置了属性(或字段),您实际上必须取消设置它或创建相同类的新对象)。这就是为什么我想出这个解决方案的原因。
问题是:首先是如何检索此集合的,您是否不能将选择添加到查询本身?
答案 1 :(得分:0)
答案 2 :(得分:0)
最好是在模型上执行查询之前选择所需的字段。但是,如果要保留初始集合,则可以使用map()
;如果要覆盖该集合,则可以使用transform()
(例如):
$selected_fields = ['filed a', 'field b']
$models->map(function ($zn) use ($selected_fields) {
return $zn->newInstance(array_only($zn->getAttributes(), $selected_fields));
})->toArray();
newInstance()
方法创建该模型的新空实例,然后getAttributes()
检索模型中存在的属性。因此,在此过程中保留了初始模型。
出于参考目的,可以在newInstance()
类上找到Illuminate\Database\Eloquent\Model
的实现,如下(在Laravel 5.2上):
/**
* Create a new instance of the given model.
*
* @param array $attributes
* @param bool $exists
* @return static
*/
public function newInstance($attributes = [], $exists = false)
{
// This method just provides a convenient way for us to generate fresh model
// instances of this current model. It is particularly useful during the
// hydration of new objects via the Eloquent query builder instances.
$model = new static((array) $attributes);
$model->exists = $exists;
return $model;
}