работа с коллекцией объектов в laravel - PullRequest
0 голосов
/ 20 февраля 2020

Пытаясь работать с коллекцией объектов.
коллекция НЕ является красноречивой, но сделана вручную Illuminate\Support\Collection

, если я правильно понял, в случае коллекции объектов я не возможность использовать большинство методов, но только те, которые могут использовать обратный вызов.

Итак, у меня есть коллекция объектов: enter image description here

и вот код ($ country = 'Russia'):

        dump($this->countries);
        $filtered = $this->countries->filter(function ($countryObj) use($country) {
            dump($countryObj->name == $country);
            return $countryObj->name == $country;
        });
        dd($filtered);

Я ожидаю, что $filtered содержит только один элемент, который возвращает true (в нашем случае Россия), но вместо него у меня есть такая же коллекция 3 элемента.

вот остальные классы, чтобы убедиться, что они связаны с коллекцией

use App\Services\Taxes\DataSourceInterface;
use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;

abstract class JsonModel extends Collection implements DataSourceInterface
{
    public function __construct()
    {
        parent::__construct($this->readDataFile(env('JSON_DATA_PATH')));
    }

    protected function readDataFile(string $path): array
    {
        $disk = Storage::disk('local');

        try {
            $dataObj = json_decode($disk->get($path), false, 10, JSON_THROW_ON_ERROR);
            return $this->loadData($dataObj);
        } catch (FileNotFoundException $e) {
            Log::error('Storage ' . $e->getMessage() . ' was not found');
        } catch (\JsonException $e) {
            Log::error('Json DataFile: ' . $e->getMessage());
        }

        return [];
    }

    abstract protected function loadData(object $dataObject): array;
}
class JsonCountries extends JsonModel
{
    public function loadData(object $dataObject): array
    {
        $data = array_filter($dataObject->countries, function ($item){
            unset($item->states);
            return true;
        });

        return $data;
    }
}

1 Ответ

0 голосов
/ 20 февраля 2020

проблема была в new static, который использовал внутри laravel методы, которые возвращают экземпляр коллекции, и фактически я не ожидаю ввода массива в моем конструкторе.

выбор между пустым массивом и чтением файла решает проблему

abstract class JsonModel extends Collection implements DataSourceInterface
{
    public function __construct($dataArr = [])
    {
        if(!is_array($dataArr))
           $dataArr = $this->readDataFile(env('JSON_DATA_PATH'));

        parent::__construct($dataArr);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...