CakePHP:路由中的MySQL查询

时间:2012-11-20 15:18:44

标签: mysql cakephp-2.0

我不知道在CakePHP中执行查询或在CakePHP中执行路由的第一件事,所以我甚至不知道如何开始为我的问题找到解决方案。也许你可以提供帮助。

我希望用户能够访问:

http://www.domain.com/movies/1

OR

http://www.domain.com/movie-nickname

两者都将访问“页面”控制器,“查看”操作。他们都应该提出页面id = 1。

(我不希望他们只是转到http://www.domain.com/pages/1

每个网页都有一个昵称,但如果留空,则网址为http://www.domain.com/CATEGORY/PAGE,如第一个示例所示。

如果昵称没有留空,有没有办法可以在我的路线中查询“SELECT id FROM pages WHERE nickname ='nickname'”

除此之外,如果页面表中的昵称是“this that”,则URL应为http://www.domain.com/this-that,这意味着连字符需要用空格替换,然后执行查询。

我有第一个URL的路线:

Router::connect(
    '/:category/:page',
    array('controller' => 'pages', 'action' => 'view'),
    array(
        'pass' => array('page'),
        'page' => '[0-9]+',
        'category' => 'shows|music|games|books|hobbies'
    )
);

我正在寻找第二种选择吗?

2 个答案:

答案 0 :(得分:0)

虽然有可能,但您通常不会看到路由器执行此类逻辑。通常,路由器将此传递给控制器​​,控制器处理解析URL路径。

作为证明,请考虑本机编辑路由的工作原理。路由器不会测试数据库中是否存在现有的 id 。控制器确实。

答案 1 :(得分:0)

我想出了我的自定义路由。

App::uses('ClassRegistry', 'Utility');

// HOMEPAGE
Router::connect('/', array('controller' => 'index', 'action' => 'index'));

$requestURI = explode('/', $_SERVER['REQUEST_URI']);
$scriptName = explode('/',$_SERVER['SCRIPT_NAME']);

for($i= 0;$i < sizeof($scriptName);$i++)
        {
      if ($requestURI[$i]     == $scriptName[$i])
              {
                unset($requestURI[$i]);
            }
      }

$param = array_values($requestURI);

$param1 = $param[0]; // domain.com/page-nickname
$param2 = $param[1]; // domain.com/category_id/page_id

// convert 'page-nickname' to 'page nickname' which is what it would be in db
$pagelink = str_replace('-', ' ', $param1);

// initiate Page mode;
$pagesModel = ClassRegistry::init('Page');

// check if there is a matching page in the db that has link column like 'page nickname'
$matchedpage = $pagesModel->find('first', array(
    'conditions' => array('Page.link LIKE' => "$pagelink"), 'recursive' => '0'
));


// Cache::write('routepagelinks', $pagelinks);

// if there is a match
if($matchedpage['Page']['id']){
    Router::connect('/' . $param1, array('controller' => 'pages', 'action' => 'view', 'page' => $matchedpage['Page']['id']), array(
    'pass' => array('page'),
    'page' => '[0-9]+'
    ));

// ... more custom routing if there is a match

}

// general routing info here


// if no page-nickname, routes page for domain.com/category_id/page_id
Router::connect(
'/:category/:page',
array('controller' => 'pages', 'action' => 'view'),
array(
    'pass' => array('page'),
    'page' => '[0-9]+',
    'category' => 'shows|music|games|books|hobbies'
    )
);