如何在使用雄辩的同时排除某些列

2022-08-30 08:10:38

当我使用雄辩时,我可以使用“where”方法,然后使用方法“get”来填充包含我在数据库中选择的内容的对象。我的意思是:

$users = User::where('gender', 'M')->where('is_active', 1)->get(['pseudo', 'email', 'age', 'created_at'])->toArray();

在这里,我可以选择要获得的列,例如“伪”,“电子邮件”等。但我在laravel文档中错过的是相反的方法。它可能是这样的:

$users = User::where('gender', 'M')->where('is_active', 1)->notGet(['pseudo', 'email', 'age', 'created_at'])->toArray();

感谢您的未来回答,祝您有美好的一天。


答案 1

如果只需要从模型的数组或 JSON 表示形式中隐藏属性,则可以使用一种或两种方法:

  • $hidden属性添加到模型中
    class User extends Model
    {
        /**
         * The attributes that should be hidden for arrays.
         */
         protected $hidden = ['password'];
    }
    
  • 使用 makeHidden 函数
    $users = $users->makeHidden(['address', 'phone_number']);
    

有关更多详细信息,请参阅其他答案...有时您不想将大量数据(地理空间,html,日志等)加载到应用程序中,它会很慢并占用更多内存。OP要求SQL查询,因此我的答案,但大多数时候,仅从JSON响应中隐藏数据更方便。


AFAIK在SQL中没有内置选项来显式排除列,因此Laravel无法做到这一点。但你可以试试这个技巧

更新

另一个技巧是指定模型中的所有列(或使用额外的查询来获取使用此答案的所有列,也可以在每次迁移后缓存它以避免两个查询),然后添加一个本地范围函数$this->getTableColumns()

// The below code requires you to define all columns in $columns.
// A better approach is to query the schema of the table and cache it after each  
// migration, for more details: https://stackoverflow.com/a/56425794/3192276

protected $columns = ['id','pseudo','email'];

public function scopeExclude($query, $value = []) 
{
    return $query->select(array_diff($this->columns, (array) $value));
}

然后你可以做:

$users = User::where('gender', 'M')
    ->where('is_active', 1)
    ->exclude(['pseudo', 'email', 'age', 'created_at'])
    ->toArray();

答案 2

在模型中使用数组是好的,但是如果您不想一直隐藏列并使用makeVisible在需要时访问它们,那么相反,请使用makeHidden函数将列隐藏在需要序列化的位置,如下所示:hidden

$res = Model::where('your query')->get();
$res->makeHidden(['column_one','column_two','column_n']);
return response()->json($res);

推荐