Sé el hecho de que Laravel eliminó la función de lists() y movió la firma de funciones como pluck() . Pero esto genera mucho trabajo para alguien que quiere actualizar de Laravel 4.x a Laravel 5.4 .
Por lo tanto, estoy tratando de encontrar una manera de hacer uso de la función existente, es decir, lists() en mi código y simplemente hacer uso de pluck()->toArray() cuando se llama a esta función.
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(); } ¡No funcionará!.
Motivo: esto debe ampliarse junto con la clase BaseModel. Pero, ya extiende Eloquent Model Class.
Intenté agregar la función requerida usando un trait como
listasWorkAround.php
<?php trait listsWorkAround { function lists($column){ return $this->pluck($column)->toArray(); } }Modelo.php
<?php namespace App; use Watson\Rememberable\Rememberable; use Illuminate\Database\Eloquent\Model as Eloquent; abstract class Model extends Eloquent { use listsWorkAround; use Rememberable; }No, no hay éxito.
Intenté agregar un ServiceProvider de servicios y agregar una función de macro para la clase de Builder , es decir lists en este caso.
Pero, el problema es que la entidad final devuelta es una Colección sin importar qué, ya que se devuelve usando la función __call del Builder. Pero, la entidad deseada es un Array .
Editar: el código que usé para el método 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(); }); } }Pero, como dije, esto aún devolvería Collection.
Entonces, esto es lo que terminé haciendo para que funcione, es decir lists() en Model::XXX->lists()
Se agregó esto en ..../config/app.php
'providers' => [ ... ... \App\Providers\ListsWorkAround::class, ],y este es el archivo de clase de proveedor.
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(); }); } }Si realmente quisiera, podría incluir lists de macros en Query Builder, Eloquent Builder y Collection
Generador de consultas de macros:
Illuminate\Database\Query\Builder::macro('lists', function ($column, $key = null) { return $this->pluck($column, $key)->all(); }); DB::table('users')->lists('email');