Zend Framework: Как правильно 'автоматически' генерировать SQL-запрос - PullRequest
0 голосов
/ 06 августа 2010

Я хочу сгенерировать следующий SQL:

SELECT `rc`.*, `c`.`name` FROM `RunConfigurations` AS `rc` INNER JOIN `Clients` AS `c` ON rc.client_id = c.id WHERE (rc.client_id = ?) ORDER BY `rc`.`config_name` ASC

Однако я получаю:

SELECT `rc`.*, `c`.* FROM `RunConfigurations` AS `rc` INNER JOIN `Clients` AS `c` ON rc.client_id = c.id WHERE (rc.client_id = ?) ORDER BY `rc`.`config_name` ASC

Разница в том, что я хочу c.name, а не c.*
Используя следующий код ZF PHP:

public function fetchConfigurations($clientId = null, $order = 'rc.config_name ASC')
    {
        $db = $this->getDb();
        $stmt = $db->select()
                ->from(array('rc' => 'RunConfigurations','c.name'))
                ->join(array('c' => 'Clients'),'rc.client_id = c.id')
                ->order($order);

        if(is_numeric($clientId))
        {
            $stmt->where('rc.client_id = ?')
                ->bind(array($clientId));
        }

        $results = $db->fetchAll($stmt);
        if(sizeof($results) > 0)
        {
            $configs = array();
            foreach($results as $row)
            {
                $configs[] = $this->createRunConfigurationFromRow($row);
            }
            return $configs;
        }
        else
        {
            die($stmt->__toString());
            return null;
        }
    }

Это усугубляет, и я чувствую, что что-то упускаю в любом из них:

->from(array('rc' => 'RunConfigurations','c.name'))

или

->join(array('c' => 'Clients'),'rc.client_id = c.id')

и примеры ZF не проливают свет на это.

1 Ответ

1 голос
/ 06 августа 2010

Ты так близко!join() на самом деле имеет третий параметр, в котором вы можете указать имена столбцов, как и второй параметр из from().

Это будет означать, что ->join(array('c' => 'Clients'),'rc.client_id = c.id',array('name')) должен сгенерировать искомый SQL.

- Цитата из руководства Zend Framework :

Третий аргумент функции join () - это массив имен столбцов, подобный тому, который используется в from ()метод.По умолчанию он равен "*", поддерживает имена корреляций, выражения и Zend_Db_Expr так же, как массив имен столбцов в методе from ().

...