📜  laravel 选择自定义列 - PHP (1)

📅  最后修改于: 2023-12-03 15:32:36.715000             🧑  作者: Mango

Laravel 选择自定义列 - PHP

当使用Eloquent ORM查询数据时,可以通过select方法选择要返回的列。但是,有时我们需要动态选择要返回的列,而不是硬编码它们。

在本文中,我们将学习如何使用Laravel控制器中的select方法来选择自定义列。

选择自定义列

让我们从一个例子开始:我们有一个users表,其中包含idnameemailcreated_at列。我们想要根据用户提供的参数动态地选择要返回的列。

为此,我们可以使用PHP的compact()函数来动态选择列。如下所示:

$columns = ['id', 'name', 'email', 'created_at'];

$selectColumns = array_flip($columns);

$data = User::select(array_intersect_key($selectColumns, compact($columns)))->get();

在这个例子中,我们首先定义了要选择的所有列的数组$columns。然后,我们将这个数组转换成一个关联数组,其中键为$columns中的值,值为null。这样我们就可以将它们与compact()一起使用来动态选择列。

最后,我们使用select()方法选择要返回的列,并将其与get()一起使用来获取数据。注意,我们通过array_intersect_key()函数将选择的列与定义的列进行了比较,以确保选择的列有效。

使用类

另一个方便的选择自定义列的方法是使用一个可复用的类。例如:

namespace App\Services;

use Illuminate\Support\Collection;

class SelectColumns
{
    protected $columns;

    public function __construct(array $columns)
    {
        $this->columns = $columns;
    }

    public function apply(Collection $collection)
    {
        $selectColumns = $this->flipColumns();

        return $collection->map(function ($item) use ($selectColumns) {
            return collect($item)->only($selectColumns)->toArray();
        });
    }

    protected function flipColumns()
    {
        return array_flip($this->columns);
    }
}

在上面的代码中,我们定义了一个SelectColumns类,它接受要选择的列的数组,并定义了一个apply()方法来选择这些列。

apply()方法接受一个Laravel Collection,并使用flipColumns()方法来将要选择的列转换成一个关联数组。然后,它使用Laravel Collection的map()方法遍历集合中的每个项目,并使用Laravel Collection的only()方法选择要返回的列。最后,我们通过调用Laravel Collection的toArray()方法将每个项目转换成一个关联数组,并返回修改后的集合。

这使我们可以在从控制器中查询数据时轻松地使用SelectColumns类来选择列。例如:

use App\Services\SelectColumns;

class UserController extends Controller
{
    public function index(Request $request)
    {
        $columns = $request->input('columns', ['id', 'name', 'email']);

        $users = User::get();

        $users = (new SelectColumns($columns))->apply($users);

        return response()->json($users);
    }
}

在上面的代码中,我们首先从请求中获取要选择的列的数组(如果没有提供,则默认为['id', 'name', 'email'])。然后,我们获取所有用户,并通过调用apply()方法来选择要返回的列。最后,我们将修改后的集合返回为JSON响应。

结论

在本文中,我们学习了如何使用Laravel控制器中的select()方法选择自定义列。你可以使用PHP的compact()函数来动态选择列,或者使用一个可复用的类来简化该过程。希望你从本文中学到了一些有用的技巧和技能!