用于连接两个表的Zend_Db查询

时间:2012-07-21 18:33:23

标签: mysql zend-framework select many-to-many

我有3张桌子:

用户[id,名称,用户名,密码,角色]

事件[id,date,location,name]

参与者[id,userId,eventId]

我想选择给定用户参与的所有事件。为此我创建了一个sql查询,我测试并返回了所需的结果。

SELECT * FROM event
INNER JOIN participant ON participant.eventId = event.id
WHERE participant.userId = $id

在此之后,我尝试将其转换为zend请求,该请求应根据本网站的其他帖子进行操作。

public function getEvents($id) 
{
    $db = Zend_Db_Table::getDefaultAdapter();
    $select = $db->select();

    $select->from('event')
           ->joinInner('participant','participant.eventId = event.id')
           ->where('participant.userId = ?', $id);

    $res = $db->query($select)->fetchAll();
    return $res;
}

我正在使用" PDO_MYSQL"作为适配器,我不会有任何插入表,选择整个表或只是特定行的问题。但上面的代码似乎做了一个简单的fatchall()内容我想要的东西。无论我尝试更改它,它总是返回事件表内容。

我的问题是:有没有人知道为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

// this is the action in your controller
public function testAction()
{
    // call getEvents, assign the result to the view
    $this->view->results = $this->_getEvents(1);

}

protected function _getEvents($id)
{
    $db     = Zend_Db_Table::getDefaultAdapter();
    $select = $db->select()
                 ->from('event')
                 ->joinInner('participant','participant.eventId = event.id')
                 ->where('participant.userId = ?', $id);

    //echo $select; // you can echo the select object to see the resulting query

    $results = $select->query(); // actually execute the query

    return $results->fetchAll(); // return all results as an array to caller
}

然后,这里是一些放在视图脚本中的示例代码:

<?php if (sizeof($this->results) == 0): ?>
<strong>No results found!</strong>
<?php else: ?>

Found <?php echo sizeof($this->results) ?> results.<br /><br />

<?php foreach($this->results as $result): ?>
    On <?php echo $result['date'] ?> the user participated in <em><?php echo $result['name'] ?></em> @ <?php echo $result['location'] ?><br />
<?php endforeach; ?>


<?php endif; ?>

最后,当您越来越熟悉ZF时,您将需要创建用于获取数据的模型和数据映射器类。您的getEvents函数将驻留在数据映射器类中。

然后,在MVC分离之后,您的控制器将从数据映射器请求数据,该数据映射器负责与DB通信并处理结果。控制器获取映射器返回的数据,然后将其分配给视图。您永远不会想要从视图中获取数据,只显示控制器为其提供的数据。

我发现Zend Framework Quickstart在首次使用ZF时非常有帮助。只需阅读一次,如果您觉得有需要,请再次浏览并实际创建示例应用程序,以便您可以感受到它。这就是我以前用ZF开始的,它给了我一个比以前更好的控制器和数据映射器的起点。

完成该指南后,阅读参考指南会更容易,也更有意义。