1

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

谢谢

4

3 回答 3

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)));
}
于 2013-05-09T00:05:03.773 回答
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'
    )
);
于 2013-05-09T16:02:22.403 回答
2

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

如果模型彼此不相关,则无法在单个查询中返回所有模型的结果 - 这是 SQL 的限制,而不是 CakePHP(编辑 - 错误!您可以使用UNION 运算符)。而且肯定没有办法在一条线上或任何东西上调用三个模型。

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

编辑(在我的回答已经被接受为正确之后!):

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

于 2013-05-08T23:59:40.573 回答