在laravel中使用makeHidden的正确方法

pro*_*mer 2 php laravel eloquent

我对分页有问题.

一切正常,没有错误,但问题是当我使用makeHidden与我的代码它改变我的json分页结果的结构

这是我的代码

 $result = Job::where('user_id','=',Auth::id())->paginate(5);

    $result= $result->makeHidden(['hasMessage']);
Run Code Online (Sandbox Code Playgroud)

没有第二行的结果是

 {
    total: 1 ,
    per_page: 5,
    current_page: 1,
    last_page: 1,
    next_page_url: null,
    prev_page_url: null,
    from: 1,
    to: 1,
   data: [
      {
        id: 4,
        sid:125,
        hasMessage: true
    }
        ]
}
Run Code Online (Sandbox Code Playgroud)

但是当我使用的时候

$result= $result->makeHidden(['hasMessage']);
Run Code Online (Sandbox Code Playgroud)

我有

   [
    {
      id: 4,
      sid:125,
    }
   ]
Run Code Online (Sandbox Code Playgroud)

有什么想法吗???这是一个错误还是有问题??

hasMessage是一个追加字段而不是真正的列

pro*_*mer 8

最后我用小编程技巧做到了

 $paginator = Job::where('user_id','=',Auth::id())->paginate(5);
 $data = $paginator->makeHidden(['hasMessage']);
 $paginator->data = $data;
 return $paginator;
Run Code Online (Sandbox Code Playgroud)

谢谢


小智 6

如果要保留分页数据使用getCollection()setCollection()方法:

$paginator = Job::where('user_id','=',Auth::id())->paginate(5);
$paginator->setCollection($paginator->getCollection()->makeHidden(['hasMessage']));
return $paginator;
Run Code Online (Sandbox Code Playgroud)


Pal*_*diN 1

toArray()您的代码中缺少您。它应该是这样的:

$result= $result->makeHidden(['hasMessage'])->toArray();
Run Code Online (Sandbox Code Playgroud)

看一下文档:

https://laravel.com/docs/5.4/eloquent-serialization#hiding-attributes-from-json

编辑:

我也尝试过paginate,它确实返回了更改后的数组,这是makeHidden().

您还可以看一下该函数:

public function makeHidden($attributes)
    {
        $attributes = (array) $attributes;

        $this->visible = array_diff($this->visible, $attributes);

        $this->hidden = array_unique(array_merge($this->hidden, $attributes));

        return $this;
    }
Run Code Online (Sandbox Code Playgroud)

当它这样做时,它array_merge会扭曲你的 json 响应。