繁体   English   中英

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

[英]How to search for different models at the same time in CakePHP?

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

谢谢

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

如果模型彼此不相关,则无法在单个查询中返回所有模型的结果-这是SQL的局限性,而不是CakePHP的局限性(编辑-错!您可以使用UNION运算符 )。 当然,不可能在一条线上或其他任何地方调用三个模型。

因此,只需进行三个单独的查询,然后对结果进行任何所需的操作即可。 您可以单独显示它们,也可以将它们全部合并为一个数组并重新排序,然后将它们一起显示-无论您有多痒。

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

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

在它们之间没有关系,在一个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)));
}

在任何模型中都包括以下内容(对于本示例,请说是媒体):

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'
    )
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM