Laravel JsonResource:array_merge_recursive():参数 #2 不是数组

Posted

技术标签:

【中文标题】Laravel JsonResource:array_merge_recursive():参数 #2 不是数组【英文标题】:Laravel JsonResource: array_merge_recursive(): Argument #2 is not an array 【发布时间】:2019-02-02 07:58:36 【问题描述】:

我有一个 JsonResourcePost 应该返回一个帖子。但是在加入其他一些数据后,我得到了这个错误:array_merge_recursive(): Argument #2 is not an array

不起作用

/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function show($slug)

    // $post = Post::findOrFail($id);
    $post = Post::where('slug', $slug)->first();
    // return single post as resource
    return new PostResource($post);

当我直接返回$posts 时,我得到一个json,几乎没问题。但它不包含连接数据comment

这里是class Post extends JsonResource

public function toArray($request)

    // return parent::toArray($request);
    $img = '.'.pathinfo('storage/'.$this->image, PATHINFO_EXTENSION);
    $imgName = str_replace($img,'', $this->image);
    $img = $imgName.'-cropped'.$img;

    return [   
        'id' => $this->id,
        'title' => $this->title,
        'body' => $this->body,
        'excerpt' => $this->excerpt,
        'image' => asset('/storage/' . $this->image),
        'image_small' => asset('storage/' . $img),
        'author_id' => $this->author_id,
        'category_id' => $this->category_id,
        'seo_title' => $this->seo_title,
        'slug' => $this->slug,
        'meta_description' => $this->meta_description,
        'meta_keywords' => $this->meta_keywords,
        'status' => $this->status,
        'featured' => $this->featured,
        'created_at' => $this->created_at,
        'updated_at' => $this->updated_at,
        'user' => User::find($this->author_id),
        'commentCount' => $this->comment->where(['status' => 1, 'id_post' => $this->id])->count(),
    ];


// **Big mistake below here**:
public function with($request)

    // return [
    //     'version' => '1.0.0',
    // ];

型号:

class Post extends Model

    public $primary_key = 'id';
    public $foreign_key = 'id_post';

    public function user()
    
        return $this->belongsTo('App\User', 'id_author', 'id');
    

    public function comment()
    
        return $this->belongsTo('App\Comment', 'id', 'id_post');
    

为什么我会收到有关 array_merge_recursive() 的警告?

【问题讨论】:

【参考方案1】:

我不想重现您的代码的问题,但是 - 您确定您包含所有内容吗?查看https://laravel.com/docs/5.6/eloquent-resources#writing-resources 可以定义额外的数据数据也会像这样返回:

/**
 * Get additional data that should be returned with the resource array.
 *
 * @param \Illuminate\Http\Request  $request
 * @return array
 */
public function with($request)

    return [
        'meta' => [
            'key' => 'value',
        ],
    ];

因此,当我将以下方法添加到此 Post 资源类时,我能够重现该问题:

public function with($request)

    return 'test';

正如你所看到的,它只返回字符串而不是数组,然后我得到了和你一样的错误。

但是当我根本没有实现这个方法或者当我只返回一个数组时,一切都很好。

所以总结一下 - 确保你没有定义 with 方法来返回数组以外的东西。

【讨论】:

就是这样。我在with() 中评论了代码,认为它没用,但我应该评论整个函数。做得好,非常感谢!

以上是关于Laravel JsonResource:array_merge_recursive():参数 #2 不是数组的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 资源条件返回

如何在 laravel join 中解码

资源文件中的 Laravel REST API 路由问题

laravel 数据模型方法

Laravel 两次预先添加基本 URL

如何使用 Laravel 在响应正文中发送 auth cookie?