【问题标题】:extending zend db select扩展 zend 数据库选择
【发布时间】:2011-09-17 14:00:19
【问题描述】:

我正在建立一个 CMS 类型的网站,会有很多管理员用户。 ACL 已用于业务层。但现在我们想将自定义 ACL 逻辑应用于基于管理员用户所属城市的模型。

例如: 管理员用户来自纽约。他可以查看与纽约市相关的内容。

我在模型中使用 Zend_Db_Select 构建了很多查询。现在我到处都改变了查询。有没有办法,我可以添加逻辑 ->where('u.city_id = ?', $admin_user_city_id) 对于每个查询。

提前致谢。

谢谢 金星

【问题讨论】:

    标签: php zend-framework zend-db zend-db-table zend-db-select


    【解决方案1】:

    我认为您可能不需要扩展Zend_Db_Table_Select。您可以通过仅使用 My_Db_Table_Abstract 扩展 Zend_Db_Table_Abstract 来完成您正在寻找的事情,您的所有模型也将扩展。在该抽象类中,您将扩展返回 Zend_Db_Table_Select 的默认 select(),并且在返回它之前,您只需将 where 子句添加到它。

    因此,每次您使用 $myModel -> select() 调用 select 时,它都会包含您的 where 子句。

    abstract class My_Db_Table_Abstract extends Zend_Db_Table_Abstract
    {
        public function select($withFromPart = self::SELECT_WITHOUT_FROM_PART)
        {
            $select = parent::select($withFromPart);
            # Retreive $admin_user_city_id
            $select -> where('u.city_id = ?', $admin_user_city_id);
            return $select;
        }
    }
    

    当然,这也意味着您已根据您所使用的型号在某处正确连接到 u 表。

    【讨论】:

    • 如果我想在 db 适配器上调用 select 对象怎么办?我认为这行不通。所以我想扩展 Zend_Db_Select..
    • 对我来说,数据库适配器并不是真正适合业务代码的地方。无论如何,如果这是您想要的方式,您仍然可以根据您现在使用的适配器制作自己的扩展 Zend_Db_Adapter_AbstractZend_Db_Adapter_Mysqli 的适配器。然后,您通过扩展select() 方法来执行我在回答中解释的相同操作。
    • 扩展Zend_Db_Select 会有点工作,因为Zend_Db_Table_Select 也会扩展它,并且您不会在该类中进行修改。这就是为什么我更愿意修改它的访问器。
    • 对不起,我没有理解您所说的“数据库适配器并不是真正的业务代码位置”的意思。我在使用 Zend_Db_Select 类的模型 $this->getAdapter()->select() 中调用数据库适配器上的 select 方法。是的,我同意,Zend_Db_Select 由 zend_db_table_select 扩展。
    • 我的意思是适配器只有关于访问数据库的代码。在这里,您想在其中添加作为业务逻辑的代码,这不是一个好习惯。如果您总是通过适配器访问Zend_Db_Select(而不是用户Zend_Db_Table_Select),您可以在构造函数中使用我的答案代码有效地创建您的My_Db_Select。然后在您的My_Db_Adapter_Mysqli 中,通过创建并返回My_Db_Select 来扩展select() 方法。如果不够清楚,我可以创建另一个答案。
    猜你喜欢
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2013-02-09
    • 2021-08-07
    • 1970-01-01
    • 2011-04-18
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多