我有一个雄辩的查询,其中连接了三个表。
$result = Kompaniya::with(['Otdel'=>function($query){
$query->select('kompaniya_id','title as otdel','id');
$query->with(array('polzovatel'=>function($query){
$query->select('otdel_id',DB::raw("CONCAT(fam, ' ', imya, ' ', otchestvo) AS full_name"));
}));
}])
->get(['title as kompaniya','id']);
因为我使用了WITH函数,所以必须选择ID。但是结果是不必要的,它看起来像一棵树。那么如何隐藏不必要的字段呢? 结果视图:
{
"data": [
{
"kompaniya": "Pfeffer-White",
"otdel": [
{
"kompaniya_id": 1,
"otdel": "Securities Sales Agent",
"id": 7,
但结果应该是:
"data": [
{
"kompaniya": "Pfeffer-White",
"otdel": [
{
"otdel": "Securities Sales Agent",
没有kompaniya_id和ID
那么我如何隐藏这些字段,而在Model中没有$ hidden,可能正在使用makeHidden?
答案 0 :(得分:1)
在您的情况下,由于您要返回JSON响应,我认为最好的解决方案是使用API Resources
构建API时,您可能需要一个介于Eloquent模型和实际返回给应用程序用户的JSON响应之间的转换层。 Laravel的资源类使您可以表达而轻松地将模型和模型集合转换为JSON。
通过这种方式,您可以根据需要创建不同类型的响应。这是一个示例:
class UserResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
// Since the $request object is passed as input, you can check
// parameters, route names, and so on. This example uses the route name
$default = [
'name' => $this->name,
'email' => $this->email
];
if($request->routeIs('profile')) {
$default['profile'] = new ProfileResource($this->whenLoaded('profile'));
} else if($request->routeIs('orders')) {
$default['accountNumber'] = $this->account_number;
$default['orders'] = new OrdersCollection($this->whenLoaded('orders'));
$default['invoices'] = new InvoicesCollection($this->whenLoaded('invoices'));
}
return $default;
}
}
通过这种方式,您可以在不更改模型默认行为的情况下,根据请求和显示/隐藏字段使用单个资源模型进行多个请求和json响应。
另一种方法可能是为每个请求创建资源,但是我认为这会破坏DRY principle。