【问题标题】:Maximum stack depth exceeded in Laravel 8Laravel 8 中超出了最大堆栈深度
【发布时间】:2021-11-21 14:54:33
【问题描述】:

我有一个资源集合:

class OverviewResource extends JsonResource
{
    
    public function toArray($request): array
    {
        return [
            'first_name' => $this->first_name,
            'last_name' => $this->last_name,
            'email' => $this->email, 
            'phone' => $this->phone,
            'friends' => OverviewResource::collection(User::getFriends()),
        ];
    }
}

我在这一行有错误

'friends' => OverviewResource::collection(User::getFriends()),

从用户模型调用此函数时

    public static function getFriends(){
         return User::where
            //query code here
        })->get();
    }

我收到了这个错误

超出最大堆栈深度

【问题讨论】:

  • 我猜是因为 OverViewRessource 的递归调用,但是如何替换它呢?
  • 为什么不在User上定义friends关系,然后简单地修改你的代码为'friends' => $this->friends?您是正确的,对自身的递归调用导致了这个问题????
  • 关系已经存在,它返回朋友的 id 然后我搜索具有这些 id 的用户并使用此集合资源返回他们
  • 那么它将是'friends' => $this->getFriends()。无论哪种方式,您都必须在这里重新考虑您的方法????旁注,关系不应该只返回 id,而是从数据库中获取的模型。如果需要,您可以致电 $this->friends->pluck('id') 获取。
  • 嗯,它是如何返回用户对象的,但我希望将用户对象传递给 OverViewResource 以获取补充数据,你现在看到问题了吗?

标签: laravel collections


【解决方案1】:

如果用户有n 朋友,则:

OverviewResource::collection(User::getFriends())

将创建n 新资源。

每个资源都会调用:

OverviewResource::collection(User::getFriends())

并创建n 新资源。

然后每个新资源都会再次调用它,然后再次调用新资源,......直到达到允许的最大堆栈。

您将不得不重新考虑如何实现递归以使其终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2021-12-28
    • 2020-06-07
    • 1970-01-01
    • 2017-07-02
    • 2013-08-23
    • 2021-09-07
    相关资源
    最近更新 更多