如何在CakePHP中同时搜索不同的模型?

时间:2013-05-08 23:29:47

标签: php cakephp cakephp-2.0 cakephp-2.1

我正在寻找同时搜索不同模型的最简单方法。我有3个模型:游戏,电影和书籍,我希望能够在一个查询中搜索游戏,电影或书名。有谁知道一个简单的解决方案?这是一个不使用插件的简单任务吗?

由于

3 个答案:

答案 0 :(得分:2)

只查询一个模型,然后查询下一个,然后查询下一个模型。

如果模型彼此不相关,则无法在单个查询中返回所有模型的结果 - 这是SQL的限制,而不是CakePHP(编辑 - 错误!您可以使用{{3} })。当然没有办法在一行或任何行中调用三个模型。

所以,只需进行三次单独的查询,然后根据结果做任何你想做的事情。你可以单独显示它们,或者将它们全部合并到一个数组中并对它们进行重新排序,然后将它们一起显示 - 无论你怎么样。

编辑(我的答案已被接受为正确!):

正如@xgalvin所提到的,您可以使用UNION operator在1个语句中连接多个表。所以,我错了。但除非不同的表非常相似,否则UNION运算符可能不太合适,你最好还是进行3次查询。如果你想要的只是id,name和type,那么@ xgalvin的回答比我的好。

答案 1 :(得分:2)

没有他们之间的关系,在一个find()声明中?否。

你可以做这样的事情:

$models = array('Game', 'Movie', 'Book');
$search = 'some title';
$results = array();

foreach($models as $model) {
    $this->loadModel($model);
    $results[$model] = $this->{$model}->find('all', array('conditions' => array($model . '.title' => $search)));
}

答案 2 :(得分:2)

在任何模型中包含以下内容(在本例中可以说是媒体):

public function search($query) {
    $query = Sanitize::clean($query);
    $result = $this->query("
        (SELECT id, name, 'book' AS type FROM books WHERE name LIKE '%$query%')
        UNION ALL
        (SELECT id, name, 'movie' AS type FROM movies WHERE name LIKE '%$query%')
        UNION ALL
        (SELECT id, name, 'game' AS type FROM games WHERE name LIKE '%$query%')
    ");
    $result = Hash::extract($result, "{n}.{n}");
    return $result;
}

如果您有其他方法可以识别元素类型,则可以删除'book' AS type部分。

确保在课程之前在模型文件中添加App::uses('Sanitize', 'Utility');

在媒体控制器中,您可以使用:

$result = $this->Media->search($query);

如果查询为“ca”,则返回类似的内容:

array(
    0 => array(
        'id' => '12',
        'name' => 'Carly',
        'type' => 'book'
    ),
    1 => array(
        'id' => '19',
        'name' => 'Camden',
        'type' => 'book'
    ),
    2 => array(
        'id' => '20',
        'name' => 'Carter',
        'type' => 'movie'
    )
);