【问题标题】:projection pomm many to many投影 pomm 多对多
【发布时间】:2018-02-22 10:01:09
【问题描述】:

我在 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 是一个灵活的实体。我应该怎么办 ?谢谢!

【问题讨论】:

    标签: php symfony many-to-many projection pomm


    【解决方案1】:
    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);
    

    ProjectionsetField() 方法向默认 table_a 投影添加了一个名为 table_bs 的新字段,类型为 table_b 数组。此查询将转储 TableA 实体的迭代器,每个实体及其对应的 TableB 实体数组位于键 table_bs 下。

    【讨论】:

    • @skyhell 您介意将此答案标记为“正确答案”吗?
    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    相关资源
    最近更新 更多