У меня большой массив имен и фамилий, мне нужно знать какие из них отличаются от текущих в базе.
Например:
$большой список = большой список ();
$storage = $this->entityTypeManager->getStorage("mi_entity");
$запрос = $хранилище->getQuery();
foreach ($largeList как $item) {
$andGroup = $query->andConditionGroup();
$andGroup
->условие('имя', $item->getName(), "<>")
->условие('фамилия', $item->getSurname(), "<>");
$запрос->условие($andGroup);
}
$ids = $запрос->выполнить();
Идея состоит в том, чтобы сравнить имя и фамилию, например, часть условия sql должна выглядеть примерно так:
ВЫБРАТЬ
"base_table"."id" КАК "id",
"base_table"."id" КАК "base_table_id"
ОТ
"entity_table" "базовая_таблица"
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
"entity_table" "entity_table"
ON "entity_table"."id" = "base_table"."id"
КУДА
(("entity_table"."name" NOT LIKE 'NAME 1' ESCAPE '\') and ("entity_table"."surname" NOT LIKE 'LAST NAME 1' ESCAPE '\')) И
(("entity_table"."name" NOT LIKE 'NAME 2' ESCAPE '\') and ("entity_table"."surname" NOT LIKE 'LAST NAME 2' ESCAPE '\')) И ..... .
Однако приведенный выше код в качестве примера создает дополнительное объединение для каждого элемента массива, например:
ВЫБРАТЬ
"base_table"."id" КАК "id",
"base_table"."id" КАК "base_table_id"
ОТ
"entity_table" "базовая_таблица"
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
"entity_table" "entity_table"
ON "entity_table"."id" = "base_table"."id"
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
"entity_table" "entity_table_2"
ON "entity_table_2"."id" = "base_table"."id"
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
"entity_table" "entity_table_3"
ON "entity_table_3"."id" = "base_table"."id"
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
"entity_table" "entity_table_4"
ON "entity_table_4"."id" = "base_table"."id"
КУДА
(("entity_table"."name" NOT LIKE 'NAME 1' ESCAPE '\') and ("entity_table"."surname" NOT LIKE 'LAST NAME 1' ESCAPE '\')) И
(("entity_table_2"."имя" НЕ НРАВИТСЯ 'NAME 2' ESCAPE '\') и ("entity_table_2"."surname" НЕ НРАВИТСЯ 'LAST NAME 2' ESCAPE '\')) И
(("entity_table_3"."имя" НЕ НРАВИТСЯ 'NAME 3' ESCAPE '\') и ("entity_table_3"."surname" НЕ НРАВИТСЯ 'LAST NAME 3' ESCAPE '\')) И
(("entity_table_4"."name" NOT LIKE 'NAME 4' ESCAPE '\') и ("entity_table_4"."surname" NOT LIKE 'LAST NAME 4' ESCAPE '\'))
В этом отрывке из запроса я показываю только 4 условия, которые генерируют 4 соединения, но если у меня есть 500, оно генерирует 500 соединений.
Как правильно написать условие, чтобы избежать этих ненужных объединений?