включают в себя следующие в любой модели (позволяет сказать, что средства массовой информации для данного примера):
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);
который возвращает что-то вроде, если запрос «ок»:
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'
)
);
Спасибо за обновление! «UNION» имеет довольно ограниченное использование, но он должен быть немного быстрее, чем три запроса и слияние их с PHP, предполагая, что схема трех таблиц аналогична. –