我正在寻找同时搜索不同模型的最简单方法。我有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'
)
);