Php 在Laravel中,我可以选择不添加$appends应用于特定数据库调用的模型吗?

Php 在Laravel中,我可以选择不添加$appends应用于特定数据库调用的模型吗?,php,laravel,eloquent,Php,Laravel,Eloquent,我继承了一个Laravel API代码库,之前没有个人接触过Laravel 我面临的一个问题是,控制器返回的内容超出了我的明确要求 例如,用户拥有所有常用的东西-名字、姓氏、电子邮件等 用户还可以订阅课程,完成课程等 在用户模型中,$appends=[…]与一些setThisAttribute函数一起使用,以从那些关联模型加载数据。我可以理解以前的开发人员为什么这样做,因为这对于正在进行的一些API调用非常方便 到目前为止,我了解这一切 但有时我想做的只是获取我明确要求的用户数据 在控制器中,我

我继承了一个Laravel API代码库,之前没有个人接触过Laravel

我面临的一个问题是,控制器返回的内容超出了我的明确要求

例如,用户拥有所有常用的东西-名字、姓氏、电子邮件等

用户还可以订阅课程,完成课程等

在用户模型中,
$appends=[…]
与一些
setThisAttribute
函数一起使用,以从那些关联模型加载数据。我可以理解以前的开发人员为什么这样做,因为这对于正在进行的一些API调用非常方便

到目前为止,我了解这一切

但有时我想做的只是获取我明确要求的用户数据

在控制器中,我可能会编写如下内容(非常简单的示例):

我想收到:

[
  {
    id: 1,
    first_name: "Jackson"
  },
  ...
]
但我现在得到的是:

[
  {
    id: 1,
    first_name: "Jackson",
    courses: [...lots of data...],
    lessons:  [...even more data...]
  },
  ...
]
所讨论的实际响应的不同之处在于,将我想要的内容下载到客户端的时间小于100ms,而将$appends内容重载到模型上的时间大于10s

是否有一种方法可以选择退出某些DB调用的$appends添加,或者我必须重写整个API以明确询问当前依赖$appends的地方需要什么?

是的

在您返回时,您可以使用:

$users=User::select('users.id','users.first_name')->get()->makeHidden(['courses','classes']);

在您返回时,您可以使用:

$users=User::select('users.id','users.first_name')->get()->makeHidden(['courses','classes']);

没有一种方法可以轻松排除
$appends
属性,因为当模型采用JSON编码时,它们会自动添加。我要说的是,目前的执行方法是一个糟糕的决定,只有在需要的时候,才应该建立关系。@fubar谢谢。我担心情况就是这样。“我想说,目前的实施方法是一个糟糕的决定”,这是我在过去几个月里一直在说的话,正如它所发生的那样:)一个选择可能是更改自定义访问器,使其仅包括课程和课程,其中关系已经加载。因此,如果不显式加载这些关系,它只返回一个空数组。要使其向后兼容,您必须找出需要这些数据的位置,并在这些实例中相应地加载关系。没有一种方法可以轻松排除
$appends
属性,因为它们是在对模型进行JSON编码时自动添加的。我要说的是,目前的执行方法是一个糟糕的决定,只有在需要的时候,才应该建立关系。@fubar谢谢。我担心情况就是这样。“我想说,目前的实施方法是一个糟糕的决定”,这是我在过去几个月里一直在说的话,正如它所发生的那样:)一个选择可能是更改自定义访问器,使其仅包括课程和课程,其中关系已经加载。因此,如果不显式加载这些关系,它只返回一个空数组。要使其向后兼容,您必须找出需要这些数据的位置,并在这些情况下相应地加载关系。您这个美丽的人!我将把我的第一个孩子留给你!你刚刚救了我几天的工作:)你这个美丽的人!我将把我的第一个孩子留给你!您刚刚保存了我计划的几天工作:)
[
  {
    id: 1,
    first_name: "Jackson",
    courses: [...lots of data...],
    lessons:  [...even more data...]
  },
  ...
]