Добавьте метод lists() в Query Builder в Laravel 5.4


Я знаю тот факт, что 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();
}

Не будет работать!
Причина: это должно быть расширено вместе с классом BaseModel. Но это уже расширяет класс модели Eloquent.

Способ 2

Попытка добавления требуемой функции с помощью 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;
}

Нет, нет успеха.

Способ 3

Попробовал добавить как ServiceProvider и добавить macro функция для Builder Класс т.е. lists в этом случае.
Но проблема в том, что конечная возвращаемая сущность является коллекцией, независимо от того, что она возвращается с помощью __call функция строителя. Но желаемая сущность является 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();
        });
    }
}

Но, как я уже сказал, это все равно вернет коллекцию.

2 ответа

Решение

Итак, это то, что я сделал, чтобы это работало, т.е. lists() в Model::XXX->lists()

Добавил это в ..../config/app.php

'providers' => [
 ...
 ...
 \App\Providers\ListsWorkAround::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();
        });
    }
}

Если бы вы действительно хотели, чтобы вы могли макрос lists в Query Builder, Eloquent Builder и коллекцию

Создание макроса Query Builder:

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


DB::table('users')->lists('email');
Другие вопросы по тегам