Zend_DB_Select : почему возвращаются все поля?

public function getWorksheetData($id) {

/** create the following query using select object:

    SELECT wc.label, wd.notes FROM worksheet_data wd
    LEFT JOIN worksheet_columns wc ON wd.column_id = wc.id;

*/
    $id = (int) $id;

    $select = $this->_db->select()
    ->from(array('wd'=>'worksheet_data'),
            array('wc.label','wd.notes'))
    ->join(array('wc'=>'worksheet_columns','wd.column_id = wc.id'))
    ->where("wd.id = :worksheet_id");

    $results = $this->_db->fetchAll($select, array('worksheet_id' => $id),Zend_Db::FETCH_ASSOC);


    return array('results'=>$results);

}

Почему этот запрос становится:

ВЫБЕРИТЕ wc.label, wd.notes, wc.* ИЗ worksheet_data КАК wd ВНУТРЕННЕЕ СОЕДИНЕНИЕ worksheet_columns КАК wc ГДЕ (wd.id = :worksheet_id)

и вернуть wc.*?


person codecowboy    schedule 16.08.2009    source источник


Ответы (1)


Вам нужно поместить пустой массив в качестве третьего аргумента метода соединения, также условие соединения не должно быть частью массива первого аргумента, а вместо этого должно быть вторым аргументом (вы заметите, что в вашем запросе нет условия соединения ). Для соединения нужны как минимум два первых аргумента, это сигнатура метода:

присоединиться (таблица, присоединиться, [столбцы])

Применив это к вашему методу соединения:

->join(array('wc'=>'worksheet_columns'),'wd.column_id = wc.id', array())

so:

$select = $this->_db->select()
        ->from(array('wd'=>'worksheet_data'),
                        array('wc.label','wd.notes'))
        ->join(array('wc'=>'worksheet_columns'),'wd.column_id = wc.id', array())
        ->where("wd.id = :worksheet_id");

дает вывод:

SELECT `wc`.`label`, `wd`.`notes` FROM `worksheet_data` AS `wd` INNER JOIN `worksheet_columns` AS `wc` ON wd.column_id = wc.id WHERE (wd.id = :worksheet_id)

В руководстве говорится:

Чтобы не выбирать столбцы из таблицы, используйте пустой массив для списка столбцов.

person karim79    schedule 16.08.2009
comment
Спасибо. в руководстве также говорится о методах joinInner(table, join, [columns]). Разве квадратные скобки не означают, что это необязательно? - person codecowboy; 16.08.2009
comment
@codecowboy - да, я добавил сигнатуру метода в свой ответ. - person karim79; 16.08.2009