在 Laravel 5.4 中的查询生成器中添加 lists() 方法

Add lists() method in Query Builder in Laravel 5.4


我知道 Laravel 删除了 lists() 函数并将函数签名移动为 pluck()。但是,对于想要从 Laravel 4.x 升级到 Laravel 5.4 的人来说,这会导致大量工作。

因此,我试图找到一种方法来仅在我的代码中使用现有函数,即 lists(),并在调用此函数时仅使用 pluck()->toArray()


我试过以下方法。

方法一

class BaseModel extends  Illuminate\Database\Query\Builder
public function __call($method, $args)
{
    return call_user_func_array($this->method,$args);
}

public function lists($column){
return $this->pluck($column)->toArray();
}

不会工作!
原因: 这需要与 BaseModel 一起扩展 class。但是,它已经扩展了 Eloquent 模型 Class.

方法二

尝试使用 trait 添加必需的功能,如

listsWorkAround.php

<?php
trait listsWorkAround
{ 
  function lists($column){
    return $this->pluck($column)->toArray();
  }
}

Model.php

<?php
namespace App;

use Watson\Rememberable\Rememberable;
use Illuminate\Database\Eloquent\Model as Eloquent;

abstract class Model extends Eloquent
{
    use listsWorkAround;
    use Rememberable;
}

没有就没有成功。

方法三

尝试添加一个 as ServiceProvider 并为 Builder Class 添加一个 macro 函数,即本例中的 lists
但是,问题是最终的 returned 实体是一个 Collection,不管它是什么 returned 使用 Builder 的 __call 功能。但是,所需的实体是 Array.

Edit : The Code I used for Method 3

<?php
namespace Providers;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\ServiceProvider;

class ListsWorkAround extends ServiceProvider
{
    /**
     * {@inheritdoc}
     */
    public function register()
    {
        Builder::macro("lists", function ($column) {        
            return $this->pluck($column)->toArray();
        });
    }
}

但是,正如我所说,这仍然 return Collection。

如果您真的想要,可以将 lists 宏设置为查询生成器、Eloquent 生成器和集合

宏查询生成器:

Illuminate\Database\Query\Builder::macro('lists', function ($column, $key = null) {
    return $this->pluck($column, $key)->all(); 
});


DB::table('users')->lists('email');

所以,这就是我最终使它起作用的方法,即 lists()Model::XXX->lists()

Added this in ..../config/app.php

'providers' => [
 ...
 ...
 \App\Providers\ListsWorkAround::class,
],

这是提供商 Class 文件。

ListsWorkAround.php

<?php
/**
 * Created by PhpStorm.
 * User: ateeq-ahmed
 * Date: 14/4/17
 * Time: 11:25 AM
 */

namespace App\Providers;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Query\Builder as QueryBuilder;
use Illuminate\Support\ServiceProvider;

class ListsWorkAround extends ServiceProvider
{
    /**
     * {@inheritdoc}
     */
    public function register()
    {
        Builder::macro("lists", function ($column, $key = null) {
            return $this->pluck($column, $key)->all();
        });

        QueryBuilder::macro("lists", function ($column, $key = null) {
            return $this->pluck($column, $key)->all();
        });
    }
}