проекция pomm много ко многим

Я использую Pomm в проекте Symfony 3.4. Вот мой вариант использования.

В модели, сгенерированной из команды Pomm, я реализовал этот метод:

    $sql = <<<SQL
select tableA.*, array_agg(tableB) as tableB
from tableA, tableA_tableB, tableA
where tableA.id=$id and tableA.id=tableA_tableB.tableA_id and tableB.id=tableA_tableB.tableB_id
group by tableA.id

SQL;

    $projection = $this->createProjection()
->setField('tableB', 'tableB', TableB::class)
;

return $this->query($sql, [], $projection);

У меня есть таблица A и таблица B. Таблица A может иметь от 0 до N tableB, а таблица B может иметь от 0 до N tableA. Моя проблема в том, что я не могу получить коллекцию tableB в поле «tableB» моей проекции. Table :: class является гибкой сущностью. Что я должен делать ? Спасибо !

2

Решение

  1. Вы никогда не должны использовать * в ваших запросах, если вы не находитесь в интерактивном терминале. Это причина, по которой существует класс проекции.
  2. Вам настоятельно рекомендуется использовать параметры запроса $* чтобы избежать их, чтобы защитить ваше приложение от внедрения SQL.

« `

$sql = <<<SQL
SELECT
:projection
FROM
table_a
INNER JOIN table_a_b USING (table_a_id)
INNER JOIN table_b USING (table_b_id)
WHERE
table_a_id = $*
GROUP BY table_a_id
SQL;

$projection = $this->createProjection()
->setField('table_bs', 'array_agg(table_b)', 'schema.table_b[]')
;
$sql = strtr($sql, [':projection' => (string) $projection]);

return $this->query($sql, [$table_a_id], $projection);

Projection setField() метод добавляет к проекции table_a по умолчанию новое поле с именем table_bs массива типа table_b. Этот запрос выведет итератор TableA сущности, каждая с соответствующим массивом сущностей TableB под ключом table_bs,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]