投影 pomm 多对多
projection pomm many to many
我在 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);
我有一个表A和一个表B。一个tableA可以有0到N个tableB,一个tableB可以有0到N个tableA。我的问题是我无法在投影的 'tableB' 字段中获取 tableB 的集合。 Table :: class 是一个灵活的实体。我应该怎么办 ?谢谢!
- 你不应该在你的查询中使用
*
除非你在交互式终端中。这就是投影 class 存在的原因。
- 强烈建议您使用查询参数
$*
以确保它们被转义,以保护您的应用程序免受 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 实体数组
我在 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);
我有一个表A和一个表B。一个tableA可以有0到N个tableB,一个tableB可以有0到N个tableA。我的问题是我无法在投影的 'tableB' 字段中获取 tableB 的集合。 Table :: class 是一个灵活的实体。我应该怎么办 ?谢谢!
- 你不应该在你的查询中使用
*
除非你在交互式终端中。这就是投影 class 存在的原因。 - 强烈建议您使用查询参数
$*
以确保它们被转义,以保护您的应用程序免受 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
.