在 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();
});
}
}
我知道 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();
});
}
}