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

Ate*_*d 4 php laravel eloquent pluck laravel-query-builder


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

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


我尝试了以下方法。

方法1

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();
}
Run Code Online (Sandbox Code Playgroud)

不工作!
原因:这需要与BaseModel类一起扩展。但是,它已经扩展了口才模型类。

方法2

尝试使用traitlike 添加Required函数

listingWorkAround.php

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

模型.php

<?php
namespace App;

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

abstract class Model extends Eloquent
{
    use listsWorkAround;
    use Rememberable;
}
Run Code Online (Sandbox Code Playgroud)

不,不是没有成功。

方法3

试图添加一个as ServiceProvidermacroBuilderClass 添加一个函数,lists在这种情况下。
但是,问题是最终返回的实体是一个Collection,无论使用__callBuilder 的函数返回它是什么。但是,所需的实体是Array

编辑:我用于方法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();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,正如我所说,这仍然会返回Collection。

Ate*_*d 5

所以,这是我落得这样做,使其工作,即lists()Model::XXX->lists()

.... / config / app.php中添加了这个

'providers' => [
 ...
 ...
 \App\Providers\ListsWorkAround::class,
],
Run Code Online (Sandbox Code Playgroud)

这是提供商类文件。

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();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)