Php Laravel集合变换/映射方法行为不一致

Php Laravel集合变换/映射方法行为不一致,php,laravel,Php,Laravel,在我的HTML前端中,我有一个jQuery数据表,显示通过AJAX从数据库中获取的所有记录——这是一件相当简单的事情。我使用Laravel集合的->transform(函数($o){…})遍历集合,并以类似数组的方式返回它。只需考虑控制器中的以下代码: $cAllRecords = DatabaseRecord::all(); if(!empty($aData['sFilterIds'])) { $cAllRecords =

在我的HTML前端中,我有一个jQuery数据表,显示通过AJAX从数据库中获取的所有记录——这是一件相当简单的事情。我使用Laravel集合的
->transform(函数($o){…})
遍历集合,并以类似数组的方式返回它。只需考虑控制器中的以下代码:

        $cAllRecords = DatabaseRecord::all();
        if(!empty($aData['sFilterIds']))
        {
            $cAllRecords = $cAllRecords->whereIn('creator', explode(',', $aData['sFilterIds']));
        }
        return response()->json(['data' => $cAllRecords->transform(function ($oDatabaseRecord) {
            /** @var $oDatabaseRecord DatabaseRecord */
            $sActionsHtml = '<a href="#">edit</a>';
            $sUrl = route('some.route', ['iDatabaseRecordId' => $oDatabaseRecord->getAttribute('od')]);
            return [
                $oDatabaseRecord->getAttribute('id'),
                $oDatabaseRecord->getAttribute('updated_at')->toDateTimeString(),
                $oDatabaseRecord->getAttribute('created_at')->toDateTimeString(),
                $sActionsHtml
            ];
        })]);
这是一个格式正确的服务器响应,将定期显示在表中。伟大的现在有些东西让我发疯了——另一个用户(ID 1,而第一个请求是用户ID 2)的相同代码返回以下内容:

{
   "data":{
      "1":[
         3,
         "2019-05-29 17:08:49",
         "2019-05-29 17:08:49",
         "<a href=\"#\">edit<\/a>"
      ]
   }
}
{
“数据”:{
"1":[
3.
"2019-05-29 17:08:49",
"2019-05-29 17:08:49",
“编辑”
]
}
}
很明显,它的格式不正确,并且没有被datatable正确解析。好的,现在将它们组合为两个过滤器,对用户ID 1和2进行过滤,将再次返回正确格式的响应:

{
   "data":[
      [
         1,
         "2019-05-29 16:44:53",
         "2019-05-29 16:44:53",
         "<a href=\"#\">edit<\/a>"
      ],
      [
         3,
         "2019-05-29 17:08:49",
         "2019-05-29 17:08:49",
         "<a href=\"#\">edit<\/a>"
      ]
   ]
}
{
“数据”:[
[
1.
"2019-05-29 16:44:53",
"2019-05-29 16:44:53",
“编辑”
],
[
3.
"2019-05-29 17:08:49",
"2019-05-29 17:08:49",
“编辑”
]
]
}
我尝试了很多方法,但都没有成功,因为这只是猜测为什么它可以与一个用户一起使用,而不能与另一个用户一起使用。(比如颠倒要过滤的ID的顺序等,但我发现过滤不是问题所在。这一定是转换,它的行为不一致。)

有没有关于为什么会发生这种情况以及如何应对的想法?我的意思是,这不是实现我所追求的目标的唯一方法,我以前一直在使用
->each()
数组推送
,但为了利用Laravel的助手(或可能的人),我想摆脱它-手动迭代和数组推送过程以前是无缝完成的,甚至应用程序的其他部分也能很好地通过数组迭代和推送进行集合转换。为什么它不在这里


更新:
->map()
收集方法的行为完全相同<代码>映射,与
转换
相反,不会改变集合本身。但是,无论如何,这都不应成为本应用程序的相关部分。我真的不明白出了什么问题。这可能是拉雷维尔的错吗

请注意,
transform
方法返回一个
illible\Support\Collection

最好在转换后调用
all()
,以获得数组结果

像这样:

...
return response()->json(['data' => $cAllRecords->transform(function ($oDatabaseRecord) {
            /** @var $oDatabaseRecord DatabaseRecord */
            $sActionsHtml = '<a href="#">edit</a>';
            $sUrl = route('some.route', ['iDatabaseRecordId' => $oDatabaseRecord->getAttribute('od')]);
            return [
                $oDatabaseRecord->getAttribute('id'),
                $oDatabaseRecord->getAttribute('updated_at')->toDateTimeString(),
                $oDatabaseRecord->getAttribute('created_at')->toDateTimeString(),
                $sActionsHtml
            ];
        })->all()]);

。。。
return response()->json(['data'=>$cAllRecords->transform(函数($oDatabaseRecord){
/**@var$oDatabaseRecord数据库记录*/
$sActionsHtml='';
$sUrl=route('some.route',['iDatabaseRecordId'=>$oDatabaseRecord->getAttribute('od'));
返回[
$oDatabaseRecord->getAttribute('id'),
$oDatabaseRecord->getAttribute('updated_at')->toDateTimeString(),
$oDatabaseRecord->getAttribute('created_at')->toDateTimeString(),
$sActionsHtml
];
})->全部());

请注意,
transform
方法返回一个
lighted\Support\Collection

最好在转换后调用
all()
,以获得数组结果

像这样:

...
return response()->json(['data' => $cAllRecords->transform(function ($oDatabaseRecord) {
            /** @var $oDatabaseRecord DatabaseRecord */
            $sActionsHtml = '<a href="#">edit</a>';
            $sUrl = route('some.route', ['iDatabaseRecordId' => $oDatabaseRecord->getAttribute('od')]);
            return [
                $oDatabaseRecord->getAttribute('id'),
                $oDatabaseRecord->getAttribute('updated_at')->toDateTimeString(),
                $oDatabaseRecord->getAttribute('created_at')->toDateTimeString(),
                $sActionsHtml
            ];
        })->all()]);

。。。
return response()->json(['data'=>$cAllRecords->transform(函数($oDatabaseRecord){
/**@var$oDatabaseRecord数据库记录*/
$sActionsHtml='';
$sUrl=route('some.route',['iDatabaseRecordId'=>$oDatabaseRecord->getAttribute('od'));
返回[
$oDatabaseRecord->getAttribute('id'),
$oDatabaseRecord->getAttribute('updated_at')->toDateTimeString(),
$oDatabaseRecord->getAttribute('created_at')->toDateTimeString(),
$sActionsHtml
];
})->全部());

@Cvetan Mihaylov的回答让我查看了所有可用的收集方法(),我找到了
->values()
来返回重新索引的值。而且-这就成功了!:-)

return response()->json(['data'=>$cAllRecords->transform(函数($oDatabaseRecord){
/**@var$oDatabaseRecord数据库记录*/
$sActionsHtml='';
$sUrl=route('some.route',['iDatabaseRecordId'=>$oDatabaseRecord->getAttribute('od'));
返回[
$oDatabaseRecord->getAttribute('id'),
$oDatabaseRecord->getAttribute('updated_at')->toDateTimeString(),
$oDatabaseRecord->getAttribute('created_at')->toDateTimeString(),
$sActionsHtml
];
})->值());

@Cvetan Mihaylov的回答让我查看了所有可用的收集方法(),我找到了
->values()
来返回重新索引的值。而且-这就成功了!:-)

return response()->json(['data'=>$cAllRecords->transform(函数($oDatabaseRecord){
/**@var$oDatabaseRecord数据库记录*/
$sActionsHtml='';
$sUrl=route('some.route',['iDatabaseRecordId'=>$oDatabaseRecord->getAttribute('od'));
返回[
$oDatabaseRecord->getAttribute('id'),
$oDatabaseRecord->getAttribute('updated_at')->toDateTimeString(),
$oDatabaseRecord->getAttribute('created_at')->toDateTimeString(),
$sActionsHtml
];
})->值());

谢谢你的建议。这本书在阅读时已经让我产生了希望,但由于它返回了完全相同的内容(这对我来说没有意义),因此证明它是错误的。谢谢你的建议。这一个在阅读时就已经让我产生了希望,但事实证明它是错误的,因为它返回了完全相同的东西(这对我来说没有意义)。好吧,这有点奇怪,使用
->values()
->all()
bacause
values()<
return response()->json(['data' => $cAllRecords->transform(function ($oDatabaseRecord) {
        /** @var $oDatabaseRecord DatabaseRecord */
        $sActionsHtml = '<a href="#">edit</a>';
        $sUrl = route('some.route', ['iDatabaseRecordId' => $oDatabaseRecord->getAttribute('od')]);
        return [
            $oDatabaseRecord->getAttribute('id'),
            $oDatabaseRecord->getAttribute('updated_at')->toDateTimeString(),
            $oDatabaseRecord->getAttribute('created_at')->toDateTimeString(),
            $sActionsHtml
        ];
    })->values()]);