Я новичок в Doctrine, поэтому для более опытных это может показаться довольно очевидным вопросом.
Я пишу инструмент импорта данных, который должен проверять, что каждая импортируемая строка содержит действительные данные. Например, в строке есть ссылка на код продукта, мне нужно проверить, существует ли уже существующий объект Product с этим кодом. Если нет, отметьте эту строку как недопустимую.
Теперь я легко могу сделать что-то подобное для каждой строки.
$productCode = $this->csv->getProductNumber();
$product = $doctrine->getRepository('MyBundle:Product')->findOneBy(array('code' => $productCode ));
Но это кажется ужасно неэффективным. Поэтому я подумал о том, чтобы вернуть всю коллекцию продуктов, а затем повторить ее.
$query = $this->getEntityManager()->createQuery('SELECT p FROM MyBundle\Entity\Product p');
$products = $query->getResult();
Все хорошо, но потом мне нужно писать запутанные циклы для поиска.
Два вопроса:
1). Мне было интересно, не хватает ли мне некоторых служебных методов, таких как у вас в Коллекциях Magento, где вы можете искать в результатах Коллекции без дополнительных обращений к базе данных. Например, в Magento это будет повторять сбор и фильтровать свойство кода.
$collection->getItemByColumnValue("code","FZTY444");
2). В настоящий момент я использую запрос ниже, который возвращает «прямоугольный массив». Более эффективно, но могло быть и лучше.
$query = $this->getEntityManager()->createQuery('SELECT p.code FROM MyBundle\Entity\Product p');
$products = $query->getResult();
Есть ли способ вернуть одномерный массив без повторения набора результатов и преобразования в плоский массив, чтобы я мог использовать in_array () для результатов?