Laravel集合上的diff()方法中的“ PHP错误:在字符串上调用成员函数getKey()”

时间:2018-10-18 18:52:33

标签: php laravel laravel-5 laravel-5.7 laravel-collection

以下是转储的收藏集:

//$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}"
  ]
}

这是错误:

{
    "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": "->"
        },

这是上面的错误中引用的第174行:

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

文档似乎非常简单:

  

diff方法将集合与另一个集合进行比较,或者   基于其值的纯PHP数组。此方法将返回   给定中不存在的原始集合中的值   集合:

我在这里缺少明显的东西吗?

1 个答案:

答案 0 :(得分:2)

我怀疑当您致电mapWithKeys时,您没有返回Model实例。这就是导致错误的原因。 Illuminate\Database\Eloquent\Collection必须是口才模型的集合,但在这种情况下不是。

一种解决方法可能是在基本集合中而不是在Eloquent集合中调用diff:

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

或者,当您调用mapWithKeys时,也可以像这样在基本集合上调用它:

$eloqCollection->toBase()->mapWithKeys(function($...) {...})(两个集合)。然后,您可以使用相同的代码:$diff = $collOne->diff($collTwo);来计算差异,因为现在$collOne$collTwo都是Illuminate\Support\Collection

的实例