首页 > 解决方案 > laravel ajax 返回连接表的整个对象

问题描述

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

管理员模型:

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;
    }

bur 当我从 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;
    }

标签: javascriptajaxlaravelvue.jseloquent

解决方案


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

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

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

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

您可以隐藏模型上的转换属性。因此,在您的 User.php 模型上添加以下内容。

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

推荐阅读