投影pomm很多很多

问题描述 投票:2回答:1

我在symfony 3.4项目中使用pomm。这是我的用例。

在从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);

我有一个tableA和tableB。 tableA可以具有0到N tableB,而tableB可以具有0到N tableA。我的问题是我无法在我的投影的“tableB”字段中获得tableB的集合。 Table :: class是一个灵活的实体。我该怎么办 ?谢谢 !

php symfony many-to-many projection pomm
1个回答
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实体的迭代器,每个实体都具有密钥table_bs下对应的TableB实体数组。

© www.soinside.com 2019 - 2024. All rights reserved.