Формат Доктрины приводит к Массиву Строк - PullRequest
0 голосов
/ 07 октября 2018

В моем репозитории у меня есть следующий метод:

  /**
  * List and Seatch for existing emails
  * @param Integer $page The pagination page
  * @param Integet $limit The page limit
  * @return String[]
  */
  public function getEmailListInOrderToSendEmail()
  {
    $em=$this->getEntityManager();

    $queryBuilder = $em->createQueryBuilder();
    $queryBuilder->select('c.email')->from(ContactEmail::class,'c');

    $value=$queryBuilder->getQuery()->getScalarResult();

    if(empty($value)){
      return [];
    }

    return $value;
  }

Пользовательский пример возвращаемого типа, который я хочу получить, является следующим:

["ddesyllas@ gmail.com "," contact@papaioannou.com "]

Но вместо этого возвращается следующий результат:

[['email' =>" ddesyllas @gmail.com "], [" name "=>" contact@papaioannou.com "]]

Поэтому наивный подход состоит в том, чтобы перебрать результаты с помощью цикла и развернуть его:

$newResults=[];
foreach($results as $result){
 $newResults[]=$result['email'];
}

Но мне это кажется неэффективным.Есть ли способ отформатировать возвращенные данные запроса по пути, который выбирается без необходимости делать цикл?

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

1 Ответ

0 голосов
/ 10 октября 2018

Вы должны создать свой собственный Гидратор как:

namespace AppBundle\Hydrators;

use Doctrine\ORM\Internal\Hydration\AbstractHydrator;

class ColumnHydrator extends AbstractHydrator
{
    protected function hydrateAllData()
    {
        return $this->_stmt->fetchAll(\PDO::FETCH_COLUMN);
    }
}

И загрузить его в Менеджер сущностей, когда вам нужно загрузить данные в виде массива:

//Namepsace Definitions etc etc
use AppBundle\Hydrators\ColumnHydrator;

//Class definition

 /**
  * List and Search for existing emails
  * @param Integer $page The pagination page
  * @param Integer $limit The page limit
  * @return String[]
  */
  public function getEmailListInOrderToSendEmail()
  {
    $em=$this->getEntityManager();
    $em->getConfiguration()->addCustomHydrationMode('ColumnHydrator', ColumnHydrator::class);

    $queryBuilder = $em->createQueryBuilder();
    $queryBuilder->select('c.email')->from(ContactEmail::class,'c');

    $value=$queryBuilder->getQuery()->getResult('ColumnHydrator');

    if(empty($value)){
      return [];
    }

    return $value;
  }

Как вы можете видеть:

  1. Вы загружаете гидратор с помощью $em->getConfiguration()->addCustomHydrationMode('ColumnHydrator', ColumnHydrator::class);

  2. Вместо извлечения результатов с помощью getScalarResult извлекайте его с помощью простого getResultи передать в качестве параметра пользовательский Гидратор.

...