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

}

为什么这个查询变成:

选择wclabel, wd. notes, wc.* FROM worksheet_dataAS wdINNER JOIN worksheet_columnsAS wcWHERE (wd.id = :worksheet_id)

并返回 wc.*?

4

1 回答 1

3

您需要将一个空数组作为连接方法的第三个参数,连接条件也不应该是第一个参数数组的一部分,而是作为第二个参数(您会注意到查询中没有连接条件)。Join 至少需要前两个参数,这是方法签名:

加入(表,加入,[列])

将其应用于您的加入方法:

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

所以:

$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)

手册说:

要从表中不选择任何列,请使用空数组作为列列表。

于 2009-08-16T08:03:11.127 回答