$table = new Zend_Db_Table(array('name'=>'rules'));
$select = $table->select();
$select->setTable($table);
$select->setIntegrityCheck(false);
$select = $select
->from(array('ru'=>'rules'),array('ru.*'))
->join(array('ro'=>'roles'),'ro.id=ru.role_id',array('role_id'=>'ro.id'))
->join(array('g'=>'groups'),'ro.group_id=g.id',array('group_id'=>'g.id'))
->join(array('ug'=>'user_groups'),"ug.group_id=g.id",array('user_group_id'=>'ug.id'))
->where("ug.user_id={$userId}")
->where("ru.resource='{$resource}'")
->where("ru.privilege='{$privilege}'");
echo "select: ".$select->__toString();
$row = $table->fetchAll();
我有上面的代码,但是当我尝试fetchAll()时它会返回表中的所有行,忽略where子句,当我使用fetchRow()它返回它找到的第一行时,忽略where子句,我打印SQL语句并单独运行它并正确执行 任何线索?
答案 0 :(得分:2)
这是正确创建数据库选择对象的方法
$db = Zend_Db::factory( ...options... );
$select = new Zend_Db_Select($db);
或者您使用数据库适配器的select()方法
$db = Zend_Db::factory( ...options... );
$select = $db->select();
你可以添加条款
// Build this query:
// SELECT *
// FROM "table1"
// JOIN "table2"
// ON "table1".column1 = "table2".column1
// WHERE column2 = 'foo'
$select = $db->select()
->from('table1')
->joinUsing('table2', 'column1')
->where('column2 = ?', 'foo');
查看Zend_Db Reference Guide以获取更多信息
答案 1 :(得分:0)
这应该有效。刚试过它。
$table = new Zend_Db_Table('rules');
$select = $table->getAdapter()->select();
$select->from(array('ru' => 'rules'), array('ru.*'))
->join(array('ro'=>'roles'), 'ro.id = ru.role_id', array('role_id'=>'ro.id'))
->join(array('g'=>'groups'), 'ro.group_id = g.id', array('group_id'=>'g.id'))
->join(array('ug'=>'user_groups'),"ug.group_id=g.id",array('user_group_id'=>'ug.id'))
->where('ug.user_id = ?', $userId)
->where('ru.resource = ?', $resource)
->where("ru.privilege = ?", $privilege);
echo (string)$select;
答案 2 :(得分:0)
@ArtWorkAD以某种方式正确。但在你的情况下,你不只是使用Zend_Db_Select。您试图扩展从Zend_Db_Table获取的Zend_Db_Select(好吧,您应该尝试使用Zend_Db_Table处理Singleton模式,但这是另一个问题)。你当前的问题(如果我们除了你确实阅读文档的速度太快之外)是这条线是正确的:
$select->setIntegrityCheck(false);
它使你的'select-from-a-zend-db-table'不再受限于Active Record Mode,并且可用于额外的连接。
但就在那之后你做了一个:
$select = new Zend_Db_Select($table);
这是您放入变量的新对象的完整创建。以前的变量值没有任何保留。您可以在它之前添加$select=null;
。所以这只是取消之前的3行。
在同一个混乱模式中这一行:
$select->setTable($table);
没有必要,因为你已经从Zend_Db_Table中选择了选择,因此表已经存在。
修改强> 而你最后一个更大的错误是:
$table->fetchAll()
您不使用内置的$select
,而是使用$table
,因此有效地忽略了$ select中所做的一切:-)。来自$select
shoudl的Fecthing可以为您提供更好的结果