douwu5009 2018-10-18 10: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 12: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

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

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部