Kohana 3.2 - 数据库搜索返回空对象

时间:2012-03-27 19:28:24

标签: php mysql search kohana limit

尝试为我的博客制作'存档'。如果搜索运行不可用的项,则返回是一个空对象。这是我的代码:

例如错误的输入:

http://www.my-site.com/archive/2011/01/27 - 在数据库中没有此日期的帖子2011-01-27

控制器操作:

public function action_archive() {
    $posts_model = new Model_Posts();

    // Év pl.: 2012
    if($year = $this->request->param("year")) {
        // Hónap pl.: 2012-03
        if($month = $this->request->param("month")) {
            // Nap pl.: 2012-03-27
            if($day = $this->request->param("day")) {
                if ($posts = $posts_model->get_post_by_date($year . "-" . $month . "-" . $day)) {
                    $this->template->content = View::factory('posts/default')
                        ->bind('posts', $posts);
                } else
                    throw new HTTP_Exception_404;
            } else {
                if($posts = $posts_model->get_post_by_date($year . "-" . $month)) {
                    $this->template->content = View::factory('posts/default')
                        ->bind('posts', $posts);
                } else
                    throw new HTTP_Exception_404;
            }

        } else {
            if($posts = $posts_model->get_post_by_date($year)) {
                $this->template->content = View::factory('posts/default')
                    ->bind('posts', $posts);
            } else
                throw new HTTP_Exception_404;
        }
    } else
        // Nem található archívum
        throw new HTTP_Exception_404;

    return false;
}

如果搜索失败,我会尝试抛出404异常。这是模型:

public function get_post_by_date($date) {
    try {
        return DB::select()
            ->from("posts")
            ->where("date", "like", "$date%")
            ->and_where("publish", "=", "1")
            ->as_object()
            ->execute();
    } catch (Database_Exception $e) {
        Kohana::$log->add(Log::ERROR, Database_Exception::text($e));
    }

    return false;
}

1 个答案:

答案 0 :(得分:0)

如果您只需要检查数据库中是否有特定条目使用      - >执行() - >计数();

在您的情况下,您将需要实际的帖子,因此您可以使用Database_Result类的count方法(它实现Countable接口)。

$posts = $posts_model->get_post_by_date($year . "-" . $month . "-" . $day);
if ($posts->count()) {
    $this->template->content = View::factory('posts/default')
        ->bind('posts', $posts);
} else
    throw new HTTP_Exception_404;

删除try-catch块。如果您的查询正确,则不需要它。