【问题标题】:laravel toArray() taking too longlaravel toArray() 耗时太长
【发布时间】:2020-09-27 05:20:45
【问题描述】:

我有这段代码,我正在尝试填充一个 json,因为这是一个 API。

$mids   = Message::where('sender', $user)
                    ->orWhere('receipient', $user)
                    ->lists('mid');

$last   = Message::whereIn('mid', $mids)->orderBy('mid', 'desc')->first();
$final  = $last->toArray();
return $final;

如果我不将 $last 设置为数组,那么它只会返回如下内容:

"incrementing": true,
"timestamps": true,
"exists": true

但是当我添加 toArray() 函数时,它只会不断加载和加载,直到服务器说超出执行时间。为什么?


其他信息

此代码在一个模型中,它的getLastMsgAttribute 我附加了last_msg

【问题讨论】:

  • toArray 同时运行 attributesToArray()relationsToArray() 并仅合并 2 个数组。您可以尝试分别运行它们(它们都是公共方法)并查看是否有效,它可能有助于调试出了什么问题。
  • @FDL relationsToArray() 加载页面,attributesToArray() 没有,它只是继续加载。
  • 作为旁注,我建议检查 $mids 不是一个空数组。如果 $mids 在空数组中,您的 whereIn 约束将抛出 SQLException。

标签: php laravel


【解决方案1】:

正如@naththedeveloper 提到的,toArray 将确定需要检索的属性和关系,以便将集合转换为模型。我们的问题是我们在模型上有 3 个修改器(例如 getSomeAttribute),其中一个为每个模型执行一个数据库查询,这意味着 2000 个查询(所有这些查询实际上都是重复的)。

所以检查你的属性和关系

还可以查看resources,因为我认为这允许您定义自己的 toArray 方法,这样您就可以只选择最终数组所需的字段。

你也可以只使用 Laravel 的集合“pluck”方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2018-02-27
    • 2013-05-28
    • 2014-05-30
    相关资源
    最近更新 更多