【问题标题】:Laravel 5.1 How to sort collection using lists() methodLaravel 5.1 如何使用 lists() 方法对集合进行排序
【发布时间】:2018-01-02 18:42:56
【问题描述】:

我有两个问题/帮助在这里解决:

  1. 如何减少这行代码中的冗余$this->all()->lists('name', 'id')->all()
  2. 如何使用orderBy方法调用mutator。

helper.php

if (! function_exists('withEmpty')) {

    function withEmpty($selectList, $emptyLabel = '')
    {
        return array('' => $emptyLabel) + $selectList;
    }
}

Agent.php(模型)

public function getNameAttribute($value){
    return $this->lname.', '.$this->fname.' '.$this->mname;
  }

public function listAgents($emptyLabel = '--Select Agent--'){

    return withEmpty($this->all()->lists('name', 'id')->all(), $emptyLabel);


  }

【问题讨论】:

    标签: php laravel laravel-5.1


    【解决方案1】:

    1. 更改:

    $this->all()->lists('name', 'id')->all()
    

    收件人:

    $this->all()->lists('name', id)
    

    2.你不能这样做。使用带有闭包的 sortBy()sortByDesc() 集合方法:

    ->sortBy(function($i) {
        return $i->name;
    });
    

    【讨论】:

    • 谢谢,但是在 'pluck' 中,laravel 仍然抛出异常 'Column not found: 1054 Champ 'name''。
    • @jp.palubs 哦,您使用的是 5.1。在这种情况下,请使用lists(),正如我在更新的答案中所示。
    • 仍然有错误,但是当我将 'name' 更改为 'lname' 时它起作用了(因为它是表中的字段名称)。但是当我尝试只是“名称”突变时它没有。我应该尝试其他方式来调用该“名称”还是在我的代码中组合两个字段?
    • @jp.palubs 因为 name 是访问器,所以这样做all()->lists('name', 'id')。对于列,您不需要先执行查询。因此,当您执行all()->listst() 时,您使用的是收集方法而不是 Eloquent 构建器方法。
    • 现在它抛出“试图获取非对象的属性”,这是因为我将代码放在模型中吗?
    【解决方案2】:

    您可以使用 plucksortBy 方法,然后应用闭包

    $this->pluck('name', 'id')->sortBy(function($el) {
        return $el->name;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 2016-08-03
      相关资源
      最近更新 更多