cam*_*aca 13 zend-framework zend-db-select
我正在研究一些 问题,询问如何在Zend Framework查询中进行连接,但答案总是像"只做setIntegrityCheck(FALSE)
".
我的问题是:为什么我需要这样做?
在我看来,禁用"完整性检查"并不是使这项工作正常的方法.在我的特定情况下,我正在使用带有外键的一些InnoDB表的MySQL数据库,例如:
CREATE TABLE IF NOT EXISTS `tableA`
(
`id` CHAR(6),
`name` VARCHAR(255),
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `tableB`
(
`tableA_id` CHAR(6),
`somefield` VARCHAR(255),
PRIMARY KEY (`tableA_id`)
) ENGINE=InnoDB;
ALTER TABLE `tableB` ADD FOREIGN KEY fk1 (`tableA_id`) REFERENCES `tableA` (`id`);
Run Code Online (Sandbox Code Playgroud)
(这是我的数据库的一个非常简化的版本)
而且,我的查询代码如下所示:
$table = new Zend_Db_Table('tableB');
$select = $table->select(TRUE)
->join(array('a' => 'tableA'), 'tableB.tableA_id = a.id');
$result = $table->fetchAll($select);
Run Code Online (Sandbox Code Playgroud)
这给了我"选择查询无法与另一个表连接"异常,除非我添加setIntegrity(FALSE)
到我的$select
.
dre*_*010 23
呼叫setIntegrityCheck(false)
是进行联接的正确方式; 如果你正在使用Zend_Db_Table
和Zend_Db_Table_Select
,你不能加入,除非您禁用完整性检查.
完整性检查就是为了确保查询不使用多个表,并且在适当的位置确保Zend_Db_Table_Row
可以删除或修改对象然后保存,因为行数据是单个表所独有的,并且不是来自不同表格的数据混合.
要表明您想要使用多个表,请指定setIntegrityCheck(false)
让Zend Framework知道它是故意的.结果是你得到一个无法调用save()
或delete()
打开的锁定行.
以下是Zend_Db_Table参考指南中的引用- 高级用法(跳到例27).
所述Zend_Db_Table_Select对象主要是用于约束和验证,使得它可以执行标准法律
SELECT
查询.但是,在某些情况下,您可能需要Zend_Db_Table_Row组件的灵活性, 并且不需要可写或可删除的行.对于此特定用户案例,可以通过将FALSE
值传递给setIntegrityCheck()来检索行或行集.生成的行或行集将作为"锁定"行返回(意味着save(), delete()和任何字段设置方法将引发异常).
另请参见:使用Zend_Db_Table_Select进行一对多连接
好吧,我做了一些研究,这是不完全正确,你必须调用setIntegrityCheck(FALSE)
才能执行连接.
类中的相关代码Zend_Db_Select
(即找到此参数的最后一个单词的唯一位置)包含以下代码:
if ($this->_integrityCheck !== false) {
foreach ($fields as $columnEntry) {
list($table, $column) = $columnEntry;
// Check each column to ensure it only references the primary table
if ($column) {
if (!isset($from[$table]) || $from[$table]['tableName'] != $primary) {
require_once 'Zend/Db/Table/Select/Exception.php';
throw new Zend_Db_Table_Select_Exception('Select query cannot join with another table');
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,它会检查查询中的所有选定字段是否属于"主表".查询不一定必须返回所涉及的表中的所有字段.
回到我的问题中的例子,事实证明这确实有效:
$table = new Zend_Db_Table('tableB');
$select = $table->select(TRUE)
->join(array('a' => 'tableA'), 'tableB.tableA_id = a.id', NULL); // <-- notice the third parameter here
$result = $table->fetchAll($select);
Run Code Online (Sandbox Code Playgroud)
这个新查询只返回来自的字段tableB
,但您可以where
像通常使用SQL一样在任何表上添加条件,没有问题.
归档时间: |
|
查看次数: |
10279 次 |
最近记录: |