【问题标题】:laravel ajax returns whole object of joined tablelaravel ajax 返回连接表的整个对象
【发布时间】:2021-08-17 11:52:33
【问题描述】:

我只想从表用户中获取名称,但它返回网络选项卡中的整个用户对象,这会泄露电话等私人信息(仅在用户表中)

管理模型:

class Admin extends Model
{
    protected $appends = ['name'];
    public function user()
    {
        return $this->belongsTo('App\User');
    }
    public function getNameAttribute()
    {
        return $this->user?$this->user->name:'';
    }
}

管理控制器:

    public function ajaxLoadAdmins (Request $request)
    {
        $query = Admin::select('admins.slug', 'admins.about')->paginate(10);
        return $admins;
    }

当我从 ajax/axios 调用这个函数时,它会返回一个完整的用户对象以及包含用户表所有列的名称

我也尝试不使用访问器/修改器,并像下面的代码一样简单,但是当我们在 devtools 的网络选项卡中看到或者如果我们在控制台中登录它时,它仍然有一个用户对象......

  public function ajaxLoadAdmins (Request $request)
    {
        $query = Admin::select('admins.slug', 'admins.about', 'users.name')->leftjoin('users','admins.user_id','=','users.id')->paginate(10);
        return $admins;
    }

【问题讨论】:

    标签: javascript ajax laravel vue.js eloquent


    【解决方案1】:

    Laravel 中包含可能是笨重的、额外不必要的列,如果涉及一对多关系,有时还会出现多个重复模型。改为使用 with,它会急切地加载您的关系并将其转换为响应。

    Admin::with('user')->paginate(10);
    

    您的管理模型将具有此结构,并且您的用户名将被包含在内。

    {
        "slug": "admin",
        "about": "interesting",
        "user": {
            "name": "John doe"
        }
    }
    

    您可以在模型上隐藏转换后的属性。所以在你的 User.php 模型上添加以下内容。

    class User {
        protected $hidden = ['phone'];
    }
    

    【讨论】:

    • 已经尝试过这是你答案的结构 { "slug": "admin", "about": "interesting", "user": { "name": "John doe", "phone ":"03000000000" } }
    • 还有名字吗?
    • 哦,你想隐藏手机吗?我更新我的答案
    • 我想在这个单一的查询中隐藏电话,
    • return DB::table("tablename")->select("fieldname","fieldname")->paginate(10)
    猜你喜欢
    • 2017-01-26
    • 2018-09-25
    • 2015-07-22
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2017-08-25
    相关资源
    最近更新 更多