我正在寻找同时搜索不同型号的最简单方法。我有 3 个模型:游戏、电影和书籍,我希望能够在一个查询中搜索游戏、电影或书籍名称。有谁知道一个简单的解决方案?如果不使用插件,这是一件容易的事吗?
谢谢
我正在寻找同时搜索不同型号的最简单方法。我有 3 个模型:游戏、电影和书籍,我希望能够在一个查询中搜索游戏、电影或书籍名称。有谁知道一个简单的解决方案?如果不使用插件,这是一件容易的事吗?
谢谢
没有他们之间的关系,在一个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'
)
);
只需查询一个模型,然后是下一个,然后是下一个。
如果模型彼此不相关,则无法在单个查询中返回所有模型的结果 - 这是 SQL 的限制,而不是 CakePHP(编辑 - 错误!您可以使用UNION 运算符)。而且肯定没有办法在一条线上或任何东西上调用三个模型。
因此,只需进行三个单独的查询,然后对结果做任何你想做的事情。您可以单独显示它们,或者将它们全部合并到一个数组中并重新排序,然后将它们一起显示 - 无论您怎么想。
编辑(在我的回答已经被接受为正确之后!):
正如@xgalvin 提到的,您可以使用UNION 运算符在 1 条语句中连接多个表。所以,我错了。但除非不同的表非常相似,否则 UNION 运算符可能不太适合,您最好进行 3 个查询。如果您想要的只是 id、名称和类型,那么 @xgalvin 的回答比我的要好。