主页/PHP笔记/PHP问答/框架Laravel/Laravel 查询构造器:从查询结果中排除特定列

Laravel 查询构造器:从查询结果中排除特定列

Bug编译狮

Bug编译狮

在 Laravel 中,你可以使用查询构造器来处理数据库数据,并且可以灵活地从查询结果中排除特定的列。以下是如何实现这一点的示例代码:

假设我们有一个名为 users 的表,并且我们希望从查询结果中排除 password 列。

  1. 创建一个新的控制器

    php artisan make:controller UserController
  2. 在控制器中编写查询方法

    namespace AppHttpControllers;
    
    use IlluminateHttpRequest;
    use AppModelsUser;
    
    class UserController extends Controller
    {
       public function index()
       {
           // 创建一个查询构建器实例
           $query = User::select('id', 'name');
    
           // 排除 'password' 列
           $query->get(['id', 'name']);
    
           return response()->json($query->toArray());
       }
    }
  3. 配置路由: 在 routes/web.php 文件中添加相应的路由:

    use AppHttpControllersUserController;
    
    Route::get('/users', [UserController::class, 'index']);
  4. 访问 API 端点: 打开浏览器并访问 http://yourdomain.com/users,你应该会看到一个 JSON 响应,其中只包含了 idname 列的数据。

示例代码详细说明

  • 创建查询构建器实例

    $query = User::select('id', 'name');

    这行代码创建了一个查询构建器实例,并选择了 idname 列。

  • 排除特定列

    $query->get(['id', 'name']);

    这行代码使用 get 方法获取查询结果,并指定要返回的列是 ['id', 'name']

  • 将查询结果转换为数组

    return response()->json($query->toArray());

    最后,我们将查询结果转换为数组并返回给客户端。

通过这种方式,你可以灵活地从查询结果中排除特定的列,以满足不同的需求。

黑板Bug讲师

黑板Bug讲师

介绍

Laravel,目前最流行的PHP Web应用程序框架之一,因其优雅的语法和强大的功能而受到赞誉。其中,Eloquent ORM(对象关系映射器)和Query Builder使得与数据库交互变得无缝且直观。

在本教程中,我们将深入探讨使用Laravel的查询构建器从数据库中获取数据时排除特定列的方法。这在您希望确保不意外地包括私有数据(如密码)或通过避免选择不必要的大量数据来提高性能时尤其有用。

前置条件

一个包含一些示例数据的数据库设置,以便可以运行查询操作。

一个运行中的Laravel环境

基本的PHP和Laravel知识。

排除包含列select方法。

最简单的排除列的方法是通过显式指定您想要的结果中的列来实现。select方法。

<?php

use AppModelsUser;

$users = User::select('id', 'name', 'email')
            ->get();

// This will return all the users with only their id, name, and email.

?>

请注意,如果没有包含密码列,则该列隐式被排除了。

使用的是什么?addSelect方法

如果你已经开始构建查询,但想要调整返回的列,则可以使用此功能来修改要检索的列。addSelect方法来追加特定列。

<?php

$usersQuery = User::where('active', 1);
$users = $usersQuery->addSelect(['id', 'name', 'email'])->get();

?>

这使得动态查询构建更加灵活,特别是在列在运行时确定的情况下。

正在使用。Except聚合器

很遗憾,Laravel并没有提供默认的解决方案。except可以直接排除列的方法。不过,你可以手动通过遍历结果集来移除不必要的键,使用集合的特性实现。map方法。

<?php

$users = User::all()->map(function ($user) {
    return Arr::except($user->toArray(), ['password', 'remember_token']);
});

?>

这允许你在从数据库获取结果集后对其进行操作。

创建全球视野

如果在应用中频繁地排除相同列,你可以定义一个全局范围,该范围可以自动应用于所有模型的查询。

<?php

use IlluminateDatabaseEloquentBuilder;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentScope;

class ExcludeColumnsScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->select(array_diff(
            $model->getFillable(),
            ['password', 'remember_token']
        ));
    }
}

// and then in your model...

class User extends Authenticatable
{
    protected static function booted()
    {
        static::addGlobalScope(new ExcludeColumnsScope);
    }

    // ...

}

?>

这将自动排除密码和remember_token字段,从而无需每次手动定义所需的列。

使用原始查询(Raw Queries)

在需要完全控制复杂场景时,可以使用Laravel的查询构建器进行原始查询。

<?php

$users = DB::table('users')
        ->selectRaw('id, name, email')
        ->get();

// By using selectRaw, you can type out the exact SQL that you want to run.

?>

原始查询提供了极大的灵活性,但应谨慎使用以避免SQL注入漏洞。

结论。

Laravel的查询构建器提供了多种方法来排除查询结果中的列,这增强了安全性并提高了性能。无论您更喜欢指定您想要的列、使用全局作用域还是编写自定义访问器来动态隐藏某些属性,Laravel的功能都可以帮助您保持数据查询整洁且应用程序安全。

长工码奴1523

长工码奴1523

在 Laravel 中,你可以使用 select 方法来创建一个查询构造器并指定要保留的列和不保留的列。这是一个基本的例子:

use IlluminateSupportFacadesDB;

$builder = DB::table('your_table_name')
    ->select(['column1', 'column2'])
    ->whereColumn('column3', '<>', 'some_value');

$builder->get();

在这个例子中,我们首先通过 $builder 获取了一个表对象。然后,我们使用 select 方法定义了要保留的列(’column1′ 和 ‘column2’),并使用 whereColumn 方法添加了一条条件,表示 column3 应该不等于 ‘some_value’。

最后,我们调用 get() 方法执行查询,并将结果返回给用户。

注意,这个例子假设你有一个名为 ‘your_table_name’ 的表,其中有一个名为 ‘column3’ 的字段,并且你想查询所有不在 ‘column3’ 为 ‘some_value’ 的行。如果你需要根据其他条件进行查询,只需相应地修改 whereColumn 方法中的条件即可。