douwu5009 2018-10-18 18:52
浏览 506
已采纳

“PHP错误:从Laravel Collection上的diff()方法调用字符串上的成员函数getKey()

Here are the dumped collections:

//$collOne
Illuminate\Database\Eloquent\Collection {#3386
  #items: array:6 [
    4807 => "{"color_id":7,"size_id":4,"pack_id":null}"
    4808 => "{"color_id":7,"size_id":2,"pack_id":null}"
    4809 => "{"color_id":7,"size_id":6,"pack_id":null}"
    4840 => "{"color_id":44,"size_id":4,"pack_id":null}"
    4841 => "{"color_id":44,"size_id":6,"pack_id":null}"
    4842 => "{"color_id":44,"size_id":2,"pack_id":null}"
  ]
}
//$collTwo
Illuminate\Database\Eloquent\Collection {#3403
  #items: array:5 [
    430 => "{"color_id":7,"size_id":4,"pack_id":null}"
    431 => "{"color_id":7,"size_id":2,"pack_id":null}"
    433 => "{"color_id":44,"size_id":4,"pack_id":null}"
    434 => "{"color_id":44,"size_id":6,"pack_id":null}"
    435 => "{"color_id":44,"size_id":2,"pack_id":null}"
  ]
}

Here is the error:

{
    "message": "Call to a member function getKey() on string",
    "exception": "Symfony\\Component\\Debug\\Exception\\FatalThrowableError",
    "file": "[obfuscated]/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php",
    "line": 281,
    "trace": [
        {
            "file": "[obfuscated].php",
            "line": 174,
            "function": "diff",
            "class": "Illuminate\\Database\\Eloquent\\Collection",
            "type": "->"
        },

Here is the line 174 referenced in the above error:

$diff = $collOne->diff($collTwo);

The docs seem pretty straight forward:

The diff method compares the collection against another collection or a plain PHP array based on its values. This method will return the values in the original collection that are not present in the given collection:

Am I missing something obvious here?

  • 写回答

1条回答 默认 最新

  • douyuben9434 2018-10-18 20:01
    关注

    I suspect when you called mapWithKeys you did not return a Model instance. That's what's causing the error. Illuminate\Database\Eloquent\Collection must be a collection of Eloquent models but in this case it isn't.

    A workaround could be calling diff in the base collection rather than the Eloquent collection like so:

    $diff = $collOne->toBase()->diff($collTwo->toBase());
    

    Or alternatively, when you call mapWithKeys, call it on the base collection like so:

    $eloqCollection->toBase()->mapWithKeys(function($...) {...}) for both the collections. Then you can use the same code: $diff = $collOne->diff($collTwo); to compute the diff because now both $collOne and $collTwo would be instances of Illuminate\Support\Collection

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动