如果只需要从模型的数组或 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();