是否可以使用 Doctrine QueryBuilder 构建 INSERT INTO SELECT 查询?

Posted

技术标签:

【中文标题】是否可以使用 Doctrine QueryBuilder 构建 INSERT INTO SELECT 查询?【英文标题】:Is it possible to build INSERT INTO SELECT query with Doctrine QueryBuilder? 【发布时间】:2016-06-25 16:57:30 【问题描述】:

我有一些条件,需要使用该条件创建基于 SELECT 的 INSERT 查询。

查询应该是这样的:

INSERT INTO mytable (field1, field2)
SELECT f1, f2
FROM mytable2
JOIN mytable3 ON mytable3.field3 = mytable2.field2
WHERE mytable3.somefield = 'somevalue'

编辑:

我知道如何构建 INSERT INTO VALUES 查询。但是我在 Criteria 对象中有 SELECT 的条件,我需要使用它们来构建 INSERT。

我需要这样的东西

public function myInsert(Criteria $criteria)
    $qb = new QueryBuilder;
    $qb->insert('mytable')
        ->values('field1, field2') // Is it possible 
        ->select('f1, f2')         // somthing like this?
        ->from('mytable2')
        ->innerJoin('mytable2', 'mytable3', 'mytable3', 
            'mytable3.field3 = mytable2.field2')
        ->where($criteria);
    $qb->execute();

【问题讨论】:

Symfony2 (doctrine2) native sql insert的可能重复 不重复。我知道如何构建 INSERT INTO VALUES 查询,但是如何构建 INSERT INTO SELECT 查询? @mnv DQL 是非常严格的东西,它只是试图用编程语言的对象模型来做事情,它不能像 sql 一样查询。我不确定你为什么需要?您还可以使用学说查询本机 sql。你能解释一下你为什么需要吗?我们可以通过其他方式提供帮助。 我有带有过滤器的页面。用户可以选择一些东西并显示结果。可能有很多行。带分页。用户可以点击按钮根据过滤器在其他表中创建记录。作为替代方案,我可以使用 QueryBuilder 创建选择查询并选择 nedded 行。并在循环中插入每条记录。但就性能而言,这是个坏主意。 【参考方案1】:

我认为你必须建立自己的陈述。应该是这样的。

            $sql ="INSERT INTO mytable (field1, field2)
                   SELECT f1, f2
                   FROM mytable2
                   JOIN mytable3 ON mytable3.field3 = mytable2.field2
                   WHERE mytable3.somefield = 'somevalue'";
            /** @var Connection $connection */
            $connection = GeneralUtility::makeInstance(ConnectionPool::class)
                ->getConnectionForTable(self::TABLENAME);
            /** @var DriverStatement $statement */
            $statement = $connection->prepare($sql);
            $statement->execute();

【讨论】:

以上是关于是否可以使用 Doctrine QueryBuilder 构建 INSERT INTO SELECT 查询?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Doctrine 2 ODM 中的多个字段上使用 sort()?

是否可以在 Doctrine 2 ODM 中的多个字段上使用 sort()?

是否可以使用 Doctrine QueryBuilder 构建 INSERT INTO SELECT 查询?

是否可以处理 Doctrine Entity 的多个状态?

是否可以将 SQL 函数的结果用作 Doctrine 中的字段?

是否可以在没有目标实体的情况下在 Doctrine2 中建立关联?