当我使用eloquent时,我可以使用"where"方法,然后使用"get"方法来填充包含我在数据库中选择的内容的对象.

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

在这里,我可以选择想要获取的列,如"伪"、"邮箱"等. 但我在"Laravel doctor "中错过的是做相反事情的方式. 可能是这样的:

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

谢谢你future 的回答,祝你有愉快的一天.

推荐答案

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

  • 添加 $hidden属性添加到您的模型
    class User extends Model
    {
        /**
         * The attributes that should be hidden for arrays.
         */
         protected $hidden = ['password'];
    }
    
  • 使用

有关更多详细信息,请参阅其他答案...But有时你不想加载大量数据(地理空间、html、日志(log)等)在你的应用程序中,它会很慢,占用更多内存.OP要求进行SQL查询,因此我给出了答案,但大多数情况下,只隐藏JSON响应中的数据更方便.


另外,SQL中没有明确排除列的内置选项,所以Laravel无法做到这一点.但你可以试试this trick

Update

另一个技巧是指定模型中的所有列(或者使用额外的查询从this answer中获取使用$this->getTableColumns()的所有列,也可以在每次迁移后对其进行缓存,以避免两个查询),然后添加local scope函数

// 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();

Php相关问答推荐

CSV 文件中的可点击 URL 链接格式 用 PHP 下载

获取非重复记录的最大值

Htaccess 不允许访问带有参数的子目录

make:entity symfony 命令在教义Helper.php 中给出错误

使用关联数组

如何在php中传递值

Laravel 7 - 如何将多个数据插入 mysql 数据库

如何判断返回的集合关系中是否存在变量

Laravel 使用参数创建自定义异常并以 JSON 形式返回

运行composer 时禁用 xdebug

目标类控制器不存在 - Laravel 8

为什么我在引入属性类型提示时突然收到“在初始化之前不能访问类型属性”错误?

获取初始运行脚本的绝对路径

如何在 laravel 中运行特定迁移

警告:遇到非数字值

从缓存中加载 Composer

使用 Carbon 和 Blade 计算两个日期之间的差异

如何在 Ubuntu 16.04 中安装 php-curl

为什么标准会话生命周期是 24 分钟(1440 秒)?

Laravel Eloquent,其中字段为 X 或 null