在ZF2中执行INSERT INTO SELECT查询的最佳方法是什么?
我需要在ZF2中开发一个函数,从一个表中选择一个记录子集并将这些记录插入另一个表中。如果我使用SQL编程,语句将如下所示:
INSERT INTO target (tgt_col1, tgt_col2)
SELECT 'flag' as marker, src_col2 FROM source
WHERE src_col1='mycriteria'
我搜索了Doctrine文档但找不到INSERT方法。我在Doctrine标签下发布了一个similar question,缺乏响应让我相信INSERT INTO SELECT对于Doctrine来说太复杂了。
在ZF2中,我似乎“可以”使用Zend\Db\Sql\Sql
。但是,对于该解决方案,SELECT
和INSERT
是两个独立的函数,看起来INSERT
函数一次只处理一条记录。因此,Zend\Db\Sql\Sql
解决方案需要1)一组语句来从源表中选择数据,2)可能是将该数据对象转换为数组的函数,以及3)foreach
函数循环遍历数据数组并通过4)一组插入语句将每个记录单独添加到目标表。与SQL中可能的单个语句相比,这看起来很麻烦。
有更好的方法吗?
答案 0 :(得分:3)
如果是TableGateway
那么它肯定适用于最新版本的ZF2,即2.3.2
参考Album
模块 -
album
的重复表,并将其命名为album_old
。album
表。所以现在album
表为空,album_old
具有值。
要将记录从album_old
复制到album
,请执行此操作 -
use Zend\Db\Sql\Select;
....
use Zend\Db\Sql\Insert;
$select = new Select('album_old');
$select->columns(array('artist', 'title', 'cover', 'extra'));
$insert = new Insert();
$insert->into('album');
$insert->columns(array('artist', 'title', 'cover', 'extra'));
$insert->values($select);
//OR
$insert->select($select);
$this->tableGateway->insertWith($insert);
album_old
中的所有值都已插入album
表格。
参考: https://github.com/zendframework/zf2/blob/master/library/Zend/Db/Sql/Insert.php
在这里,您会发现function values()
可以array
或instanceof Select
并且还有一个新的select()
功能。