Zend Framework с использованием обычного вызова MySQL - PullRequest
1 голос
/ 11 декабря 2011

Есть ли способ использовать обычный оператор выбора mysql с Zend Framework без необходимости использовать Zend_Db :: factory

Код ниже находится в моих классах Model, который расширяет 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;

Так что мне не всегда приходится определять переменные БД в каждом методе, и у меня везде пароли mysql. Есть ли способ использовать $ this вместо создания новой фабрики $ db Zend_DB ??

1 Ответ

0 голосов
/ 12 декабря 2011

Хорошо, разобрался. Решение не очень элегантное, но работает и является портативным.

Моя установка состоит из нескольких БД, поэтому в 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'));
}

In 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);

Затем (не очень элегантный бит) в моделях добавьте метод 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);
}

И затем вы можете использовать $ this-> db в других методах класса Model, например:

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

Это работает, но все равно кажется, что должен быть более легкий путь ...

...