📅  最后修改于: 2023-12-03 15:32:36.715000             🧑  作者: Mango
当使用Eloquent ORM查询数据时,可以通过select
方法选择要返回的列。但是,有时我们需要动态选择要返回的列,而不是硬编码它们。
在本文中,我们将学习如何使用Laravel控制器中的select
方法来选择自定义列。
让我们从一个例子开始:我们有一个users
表,其中包含id
、name
、email
和created_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()
函数来动态选择列,或者使用一个可复用的类来简化该过程。希望你从本文中学到了一些有用的技巧和技能!