Добавьте метод 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');