Я хочу улучшить механизм ключевых слов.Вот контекст.
3 таблицы: содержимое, теги содержания_теги, теги
content
id | content
8 | My content
contents_tags
id | content_id | tag_id
1 | 8 | 1
2 | 8 | 2
3 | 8 | 3
4 | 8 | 4
tags
id | name
1 | Webs
2 | Web 2.0
3 | Toto
4 | Secret Web
5 | Titi
Я пытаюсь иметь следующее поведение:
Итак, содержимое 8, содержащее этот тег: «Сети» + «Веб 2.0» + «Тото» + «Секретная сеть»
Должен отображаться при поиске:
- Веб (%)
- Веб
- Веб 2.0
- Веб (%) toto
- Интернет
- Секретная сеть
- Секрет (%)
Но не на исследованиях
Я должен сделать это в MySQL, а не в PHP, потому что я использую нумерацию страниц
Мой текущий код:
public function searchByTag($q)
{
$tag = Tag::where('name', 'LIKE', '%' . $q . '%')->get();
if($tag->isEmpty()) {
if ($q == trim($q) && strpos($q, ' ') !== false) {
$q = explode(" ", $q);
$tag = Tag::where('name', 'LIKE', $q[0] . '%')
->OrWhere('name', 'LIKE', $q[1] . '%')
->get();
}
}
$query = Content::where('status', Content::STATUS_PUBLISHED);
foreach($tag as $t) {
$query->whereHas('tags', function ($query) use ($t) {
$query->where('tag_id', $t->id);
});
}
return !$tag->isEmpty()
? $query->orderBy('published_at','DESC')
: null;
}
Он работает для поиска "web + titi" или "web + 2.0", но не только для "web"