Как я могу отфильтровать свой запрос doctrine по значениям массива? - PullRequest
0 голосов
/ 28 января 2020

Я загружаю данные из своей базы данных с помощью doctrine:

$data = $this->em->getRepository('App\\Entity\\Data')->allData();

, который создает массив с большим количеством данных:

PagesGenerator.php on line 259:
array:1696 [▼
  0 => Data^ {#5430 ▼
    -id: 2298
    -uuid: "426441e418"
    -content: "two"
    -document_id: "93b7dc32f4"
  }
  1 => Data^ {#5434 ▼
    -id: 2299
    -uuid: "c1474a87a9"
    -content: ""
    -document_id: "93b7dc32f4"
  }
  2 => Data^ {#5413 ▼
    -id: 2300
    -uuid: "8bfd9b4893"
    -content: "three"
    -document_id: "edb8fa9647"
  }
  3 => Data^ {#5427 ▶}
  4 => Data^ {#5428 ▶}
  5 => Data^ {#5433 ▶}
  6 => Data^ {#5431 ▶}
  7 => Data^ {#5429 ▶}

У меня есть другой массив $docIds :

array:96 [▼
  0 => "3019b7a82f"
  1 => "b1a4c67080"
  2 => "82cf4392d7"
  3 => "55768e0955"
  4 => "74c6217001"
  5 => "71fc4c3ebf"
  6 => "35e2d3a1c6"
  7 => "50c940b223"
  8 => "2561ff454d"
  9 => "bb447530e1"

Чтобы получить высокую производительность, мне нравится предварительно фильтровать массив $data, чтобы он содержал только записи с document_id s, которые являются значениями в моем массиве $docIds;

This мой подход:

$data = $this->em->getRepository('App\\Entity\\Data')->filterByDocID($docIds);

В моем хранилище данных:

public function filterByDocID($array)
{
  $query = $this->getEntityManager()
  ->createQuery(
    "SELECT a
    FROM App\Entity\Data a
    WHERE document_id IN ('".$array."')");
    try {
      return $query->getResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
      return null;
    }
  }

Но я получаю сообщение об ошибке:

Примечание: преобразование массива в строку

1 Ответ

2 голосов
/ 28 января 2020

Есть две возможности.

Как они уже написали, вы можете взорвать свой массив.

WHERE document_id IN ('".implode(',', $array)."')");

или вы связываете массив.

$stmt->bindValue(0, array(123, 234, 345, 456, 567, 678));

Я бы предпочел связать массив, так как это было бы намного чище, чем развертывание и анализ в виде строки.

E:

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

WHERE document_id IN ('".implode("', '", $array)."')");

В противном случае попробуйте использовать LIKE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...