繁体   English   中英

Select 使用 Zend_Db_Select 忽略 where 子句

[英]Select ignores where clause using Zend_Db_Select

$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 语句并单独运行它并正确执行任何线索?

这就是您正确创建数据库 select object 的方式

$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 参考指南以获取更多信息

这应该有效。 刚刚测试过了。

    $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;

@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 模式,并且可用于额外的连接。

但就在那之后,你做了一个:

$select = new Zend_Db_Select($table);

这是您放入变量中的新 object 的完整创建。 之前的变量值没有任何保留。 你可以添加一个$select=null; 就在之前它会是一样的。 所以这只是取消了前 3 行。

在完全相同的混淆模式下,这一行:

$select->setTable($table); 

没有必要,因为您已经从 Zend_Db_Table 获取 select ,因此该表已经存在。

编辑你的最后一个更大的错误是:

$table->fetchAll()

您不使用构建的$select而是使用$table ,因此有效地忽略了 $select 中所做的一切:-)。 $select获取应该给你更好的结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM