Проблема c PHP Doctrine Collections

Awilum

Новичок
Доброго времени суток!

Пытаюсь понять почему https://www.doctrine-project.org/projects/collections.html так вот работает и как это исправить, но пока безуспешно. C одним вариантом работает без ошибок, но на втором варианте входящих данных в упор не хочет работать.

Пример 1

Код:
$collection = new ArrayCollection(['entry1'=> ['visibility' => 'draft'],
                                    'entry2' => ['visibility' => 'public']]);

$criteria = new Criteria();

$expr = new Comparison('visibility', Comparison::NIN, ['draft', 'hidden']);

$criteria->where($expr);

$entries = $collection->matching($criteria);

$entries = $entries->toArray();

print_r($entries);
Получим результат:

Код:
Array ( [entry2] => Array ( [visibility] => public ) ) Array ( [entry2] => Array ( [visibility] => public ) )

Пример 2

Код:
$collection = new ArrayCollection(['entry1'=> ['visibility' => 'draft'],
                                   'entry2' => ['title' => 'Test title']]);

$criteria = new Criteria();

$expr = new Comparison('visibility', Comparison::NIN, ['draft', 'hidden']);

$criteria->where($expr);

$entries = $collection->matching($criteria);

$entries = $entries->toArray();

print_r($entries);
Получим ошибку:
Код:
Twig \ Error \ RuntimeError
An exception has been thrown during the rendering of a template ("Undefined index: visibility").
Почему бы ему не вернуть только найденые результат(ы) а не крешится?

Видео:
 

Awilum

Новичок
проблема в том что с такими данными поиск работает

$collection = new ArrayCollection(['entry1'=> ['visibility' => 'draft'],
'entry2' => ['visibility' => 'public']]);

но если вдруг в одной из entryN нет искомого ключа (пример: visibility), тогда все крэшится

$collection = new ArrayCollection(['entry1'=> ['visibility' => 'draft'],
'entry2' => ['title' => 'Test title']]);

Whoops \ Exception \ ErrorException (E_NOTICE)
Undefined index: visibility
 

Awilum

Новичок

Awilum

Новичок
или сделать такой вот костыль в на уровне своего приложения чтобы не лезть в вендор директорию

Код:
$oldErrorReporting = error_reporting();
error_reporting(0);
... код для поиска в коллекции ...
error_reporting($oldErrorReporting);
работает, но не очень радует факт наличия такого костыля для обхода этой проблемы
 

AmdY

Пью пиво
Команда форума
Не знаю ваших бизнес требований, но кажется странным, что у вас коллекция с разным набором полей.

Фиксить это надо приведением к единому типу. Например, заверните данные в объект, который будет корректно обрабатывать отсутствующие поля
PHP:
class Foo {
    function getTitle()...
    function getVisibility()....
}

$collection = new ArrayCollection([
    new Foo(['entry1'=> ['visibility' => 'draft']),
    new Foo(['entry2' => ['title' => 'Test title']
]
);
 
Последнее редактирование модератором:
Сверху