【问题标题】:Laravel collection changing key issueLaravel 集合更改关键问题
【发布时间】:2018-06-19 22:34:43
【问题描述】:

我发现我的集合使用了错误的键,所以我开始调试代码。这样做我注意到如果我将数组中超过 2500 个项目传递给集合,它会丢失它们的键,否则,如果我传递的项目少于 2501 个,它会保持正常

限制为 2500 项

    public function getProdutos($codigoconcentrador, $codigoempresa, $pluck)
    {
        $model_produtos = new Produto();

        $query = $model_produtos->newQuery();

        $query->where('codigoconcentrador', $codigoconcentrador)
            ->where('codigoempresa', $codigoempresa)
            ->where('status', 'A');

        $query->limit(2500);

        dd($query->pluck('nomeproduto', 'codigopro'));

        if ($pluck) {
            return $query->pluck('nomeproduto', 'codigopro');
        } else {
            return $query->get();
        }
    }

结果

Collection {#260 ▼
  #items: array:2500 [▼
    1 => "CIMENTO VOTORAN CP II Z 32 - 50 KG"
    7 => "SOPA 250G - LEGUMES"
    8 => "SOPA 250G - CARNE"
    9 => "CIMENTO CIPLAN CP II Z 32 - 50 KG"
    10 => "ARGAMASSA VOTORAN ACI"
    11 => "ARGAMASSA VOTORAN ACII"
    13 => "ARGAMASSA COLA BEM ACI "
    14 => "ARGAMASSA COLA BEM ACII "
    ...
    ...

没有限制

    public function getProdutos($codigoconcentrador, $codigoempresa, $pluck)
    {
        $model_produtos = new Produto();

        $query = $model_produtos->newQuery();

        $query->where('codigoconcentrador', $codigoconcentrador)
            ->where('codigoempresa', $codigoempresa)
            ->where('status', 'A');

//        $query->limit(2500);

        dd($query->pluck('nomeproduto', 'codigopro'));

        if ($pluck) {
            return $query->pluck('nomeproduto', 'codigopro');
        } else {
            return $query->get();
        }
    }

结果

Collection {#3809 ▼
  #items: array:2875 [▼
    0 => "CIMENTO VOTORAN CP II Z 32 - 50 KG"
    1 => "SOPA 250G - LEGUMES"
    2 => "SOPA 250G - CARNE"
    3 => "CIMENTO CIPLAN CP II Z 32 - 50 KG"
    4 => "ARGAMASSA VOTORAN ACI"
    5 => "ARGAMASSA VOTORAN ACII"
    6 => "ARGAMASSA COLA BEM ACI "
    7 => "ARGAMASSA COLA BEM ACII "
    8 => "REATOR 2 X 40 BIVOLT"
    9 => "CHA VERDE SOLUVEL - LIMAO 200G - UND"
    10 => "ROLDANA P/ POCO GANCHO 12CM. R.C.A."
    ...
    ...

更新

函数正在接收第二个参数$query->pluck('nomeproduto', 'codigopro'),所以我调试了pluck函数,当它变成一个集合时它丢失了密钥

vendor/laravel/framework/src/Illuminate/Support/Collection.php

public function pluck($value, $key = null)
    {
        dd(Arr::pluck($this->items, $value, $key)); // First Result
        dd(new static(Arr::pluck($this->items, $value, $key))); // Second Result
//        return new static(Arr::pluck($this->items, $value, $key));
    }

【问题讨论】:

    标签: php arrays laravel collections


    【解决方案1】:

    当您将密钥作为第二个参数传递时,您将获得第一个结果:

    pluck('nomeproduto', 'codigopro')
    

    如果你没有通过,你会得到第二个:

    pluck('nomeproduto')
    

    所以,请仔细检查代码。

    【讨论】:

    • $query .= $query->limit(2500);??
    • 不,该函数正在接收第二个参数,所以我调试了 pluck 函数,当它变成一个集合时它丢失了密钥。 第一个结果: Arr::pluck($this->items, $value, $key); 第二个结果: new static(Arr::pluck($this->items, $value, $key));
    【解决方案2】:

    plug 方法搜索具有该名称的列并将其用作每个元素的新键...如果您只想获取每个元素的两列,则可以使用 $collection->only('aa', 'bb')。除此之外,由于许多原因,您应该使用分页... 2500 多个元素的数组是疯狂的。

    【讨论】:

    • 我需要它作为关键原因是选择输入,我知道这很疯狂 kkkkk,我正在处理用户编写它时使用 ajax 搜索产品的输入,但是我觉得就算是疯了也不应该丢钥匙吧?
    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 2015-12-04
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多