У меня есть форма расширенного поиска, которая фильтрует результаты из базы данных mySql. Есть одна часть, которая представляет собой поиск по ключевым словам, который должен соответствовать любым текстовым полям во всех связанных таблицах.
Это код указанной формы поиска.
<form action="/search" method="POST">
Keyword: <input type="text" name="keyword">
Matching: <input type="radio" name="keywordControl" value="AND"> Match every words<br>
<input type="radio" name="keywordControl" value="OR"> Match any words<br>
<input type="submit">
</form>
Таблицы:
CREATE TABLE `User` (
`id` INT,
`firstName` VARCHAR(100),
`lastName` VARCHAR(100),
`email` VARCHAR(100),
`address` VARCHAR(400)
);
CREATE TABLE `savedLinks` (
`id` INT,
`userId` INT,
`linkName` VARCHAR(100),
`linkURL` VARCHAR(400),
`linkNote` VARCHAR(100),
);
CREATE TABLE `BlogEntry` (
`id` INT,
`userId` INT,
`entryTitle` VARCHAR(100),
`entryExcerpt` VARCHAR(100),
`entryBody` TEXT,
);
Что мне нужно:
, если я ищу по этим параметрам:
ключевое слово: naruto area51
keywordControl: AND
Я ожидаю увидеть результаты, которые соответствуют как наруто, так и области 51 во всех таблицах.
Однако я могу отфильтровать результаты в одной таблице. Мне удается отображать результаты, такие как
"Мистер Наруто ", который имеет адрес " Area51 lane ..."
Любой, кто сохранил ссылки, содержащие как " Наруто ", так и " Area51 "
Любой, кто ведет блого " Наруто Бег" и " Зона51 "
Но я не могу привести такие результаты, как
"Мистер Наруто ", который ведет блог о " Area51 "
всех, кто сохранил ссылки о " Наруто", и написал в блоге о" Area51"
Потому что последние должны искать по всем таблицам. Это мой красноречивый код laravel.
$keyword = urldecode($request->input('keyword'));
$keywords = preg_split('/\s+/', $keyword, -1, PREG_SPLIT_NO_EMPTY);
$users = User::when(sizeof($keywords) > 0, function ($query) use ($keywords, $keywordControl) {
$query->where(function ($query) use ($keywords, $keywordControl) {
foreach ($keywords as $keyword) {
if ($keywordControl == 'AND') {
$query->whereRaw("CONCAT(firstName,lastName,email,address) LIKE ?", "%{$keyword}%");
} else {
$query->orWhereRaw("CONCAT(firstName,lastName,email,address) LIKE ?", "%{$keyword}%");
}
}
});
})
->when(sizeof($keywords) > 0, function ($query) use ($keywords, $keywordControl) {
$query->whereHas('savedLinks', function ($query) use ($keywords, $keywordControl) {
$query->where(function ($query) use ($keywords, $keywordControl) {
foreach ($keywords as $keyword) {
if($keywordControl == 'AND'){
$query->whereRaw("CONCAT(linkName,linkURL,linkNote) LIKE ?", "%{$keyword}%");
} else {
$query->orWhereRaw("CONCAT(linkName,linkURL,linkNote) LIKE ?", "%{$keyword}%");
}
}
});
});
})
->when(sizeof($keywords) > 0, function ($query) use ($keywords, $keywordControl) {
$query->whereHas('blogEntry', function ($query) use ($keywords, $keywordControl) {
$query->where(function ($query) use ($keywords, $keywordControl) {
foreach ($keywords as $keyword) {
if($keywordControl=='AND') {
$query->whereRaw("CONCAT(entryTitle,entryExcerpt,entryBody) LIKE ?", "%{$keyword}%");
} else {
$query->orWhereRaw("CONCAT(entryTitle,entryExcerpt,entryBody) LIKE ?", "%{$keyword}%");
}
}
});
});
})
->get();
Я имею в виду, что мне нужно создать другую таблицу и объединить весь этот текст в одном поле только для целей поиска. Я не знаю, хорошая это идея или нет. Пожалуйста, ведите меня, спасибо!