«Ошибка PHP: вызов функции-члена getKey () on string» из метода diff () коллекции Laravel - PullRequest
0 голосов
/ 18 октября 2018

Вот сброшенные коллекции:

//$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 голосов
/ 18 октября 2018

Я подозреваю, что когда вы позвонили mapWithKeys, вы не вернули экземпляр Model.Вот что вызывает ошибку.Illuminate\Database\Eloquent\Collection должен быть коллекцией моделей Eloquent, но в данном случае это не так.

Обходной путь может вызывать diff в базовой коллекции, а не коллекции Eloquent, например:

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

Или, в качестве альтернативы, когда вы вызываете mapWithKeys, вызовите его для базовой коллекции следующим образом:

$eloqCollection->toBase()->mapWithKeys(function($...) {...}) для обеих коллекций.Тогда вы можете использовать тот же код: $diff = $collOne->diff($collTwo); для вычисления различий, потому что теперь и $collOne, и $collTwo будут экземплярами Illuminate\Support\Collection

...