从Eloquent收集器数组中选择特定字段|拉拉韦尔

时间:2018-12-05 09:23:44

标签: php laravel

我有一个包含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可以直接与雄辩的模型一起工作,而不能与集合一起工作。

3 个答案:

答案 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)

您在寻找only()

$filtered = $collection->only(['list', 'of', 'fields', 'to', 'keep']);

mapWithKeys()

答案 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;
    }