[英]Is it possible to page and sort two different models in the same view in 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.