【问题标题】:Zend Framework using regular mysql select callZend Framework 使用常规 mysql 选择调用
【发布时间】:2011-12-11 15:29:35
【问题描述】:

有没有办法在 Zend Framework 中使用常规的 mysql select 语句而不必使用 Zend_Db::factory

下面的代码在我的模型类中,它扩展了 Zend_Db_Table_Abstract

我目前可以这样做(可行):

    $db = Zend_Db::factory('Pdo_Mysql', array(
                'host' => 'localhost',
                'username' => 'dbuser',
                'password' => 'dbuserpass',
                'dbname' => "somedbname"
            ));

    $select = "SELECT iv.* 
                FROM image_variations AS iv
                LEFT JOIN images AS i ON (i.image_id = iv.image_id)
                LEFT JOIN product_images AS pi ON (pi.image_id = iv.image_id)
                WHERE pi.pid = '$pid'
                && iv.image_type_id = '$image_type_id' ";

    $stmt = $db->query($select);
    $rows = $stmt->fetchAll();
    return $rows;

我想这样做:

    $select = "SELECT iv.* 
                FROM image_variations AS iv
                LEFT JOIN images AS i ON (i.image_id = iv.image_id)
                LEFT JOIN product_images AS pi ON (pi.image_id = iv.image_id)
                WHERE pi.pid = '$pid'
                && iv.image_type_id = '$image_type_id' ";

    $stmt = $this->query($select);
    $rows = $stmt->fetchAll();
    return $rows;

所以我不必总是在每个方法中定义 db 变量,并且到处都有 mysql 密码。有没有办法使用 $this 而不必实例化一个新的 $db Zend_DB Factory??

【问题讨论】:

  • 想出了一个办法,我会在 5 小时后发布..

标签: zend-db zend-framework


【解决方案1】:

好的,想通了。该解决方案不是很优雅,但可以工作且可移植。

我的设置包含多个数据库,所以在 Bootstrap.php 中我有:

protected function _initDatabase() {
    $resource = $this->getPluginResource('multidb');
    $resource->init();

    Zend_Registry::set('db', $resource->getDb('db'));
    Zend_Registry::set('shopdb', $resource->getDb('shopdb'));
}

在 Application.ini 中

resources.multidb.db.adapter = PDO_MYSQL
resources.multidb.db.host = 127.0.0.1
resources.multidb.db.username = user
resources.multidb.db.password = userpassword
resources.multidb.db.dbname = dbone
resources.multidb.db.isDefaultTableAdapter = true
resources.multidb.db.default = true


resources.multidb.shopdb.adapter = PDO_MYSQL
resources.multidb.shopdb.host = 127.0.0.1
resources.multidb.shopdb.username = user
resources.multidb.shopdb.password = userpassword
resources.multidb.shopdb.dbname = dbtwo
resources.multidb.shopdb.isDefaultTableAdapter = false

在 index.php 中

$config = new Zend_Config_Ini(APPLICATION_PATH . "/configs/application.ini");
Zend_Registry::set('settings', $config);

然后(不是很优雅的部分)在 Models 中添加一个 init() 方法

protected $db;

public function init() {
    $settings = Zend_Registry::get('settings');
    $adapter = $settings->production->resources->multidb->shopdb->adapter;
    $params = array(
        'host' => $settings->production->resources->multidb->shopdb->host,
        'username' => $settings->production->resources->multidb->shopdb->username,
        'password' => $settings->production->resources->multidb->shopdb->password,
        'dbname' => $settings->production->resources->multidb->shopdb->dbname,
    );
    $this->db = Zend_Db::factory("$adapter", $params);
}

然后你可以在Model类的其他方法中使用$this->db,例如:

public function getProductImages($pid, $image_type_id) {

    $select = "SELECT iv.* 
                FROM image_variations AS iv
                LEFT JOIN images AS i ON (i.image_id = iv.image_id)
                LEFT JOIN product_images AS pi ON (pi.image_id = iv.image_id)
                WHERE pi.pid = '$pid'
                && iv.image_type_id = '$image_type_id' ";

    $stmt = $this->db->query($select);
    $rows = $stmt->fetchAll();
    return $rows;
}

它有效,但似乎应该有更简单的方法......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多