如何在Eloquent中隐藏关系列?

时间:2019-09-19 13:03:21

标签: json laravel eloquent

我有一个雄辩的查询,其中连接了三个表。

      $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?

1 个答案:

答案 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