Поиск по тегу на Laravel И и ИЛИ - PullRequest
0 голосов
/ 27 сентября 2018

Я хочу улучшить механизм ключевых слов.Вот контекст.

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
  • Интернет
  • Секретная сеть
  • Секрет (%)

Но не на исследованиях

  • Web 3.0

Я должен сделать это в 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"

1 Ответ

0 голосов
/ 27 сентября 2018

используйте это

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();
        }
        else
        {
             $tag = Tag::where('name', 'LIKE', $q)
                     ->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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...