Поиск и много-много отношений - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть модель сообщений и модель тегов. Мне нужно создать поисковый запрос, чтобы пользователь вводил теги, а затем функция берет этот тег и отображает в нем все связанные сообщения, поэтому отношение «многие ко многим» относится ко многим тегам.и теги принадлежат многим постам, поэтому я объявил корабль отношений, но я не могу найти способ сделать так, чтобы предложение where с кораблем отношений было очевидным. Я не знаю, что добавить в название модели и в функцию отношений

Это моя функция поиска

public function search()
{
    $q = Input::get ( 'q' );
    $posts = post::where('tag_name','LIKE','%'.$q.'%')->tags()->get;
    dd($posts);
    if(count($posts) > 0)
        return view('guest.blog.search_result' , ['title' => 'Resaults'])->withDetails($posts)->withQuery ( $q );
    else return view ('guest.blog.no_resault' , ['title' => 'Resaults'])->withMessage('No Details found');
}

модель моих сообщений

public function tags()
{
   return $this->belongsToMany('\Conner\Tagging\Model\Tagged');
}

модель моих тегов (из пакета rtconner)

это отношение изисходный пакет

public function tag()
{
    $model = $this->taggingUtility->tagModelString();
    return $this->belongsTo($model, 'tag_slug', 'slug');
}

и я объявил это отношение

public function posts()
{
    return $this->belongsToMany('App\Post');
}

мой вопрос, как правильно выполнить поисковый запрос без ошибок

Примечание: естьполе поиска, где пользователь будет писать только теги, поэтому я должен взять этот ввод, который является тегом, затем поискать соответствующий ему пост, а затем я покажу его пользователю

РЕДАКТИРОВАТЬ

моя функция поиска

public function search()
      {
          $q = Input::get ( 'q' );

// я использовал get, потому что я хочу, чтобы все сообщения, принадлежащие одному тегу, $ posts =Tagged :: где ( 'tag_name', 'LIKE', '%' $ д '%'..) -> с ( 'сообщений') -> Get ();дд ($ сообщений);if (count ($ posts)> 0) возвращаемое представление ('guest.blog.search_result', ['title' => 'Results']) -> withDetails ($ posts) -> withQuery ($ q);иначе возвращаемое представление ('guest.blog.no_result', ['title' => 'Results']) -> withMessage ('Детали не найдены');}

мои модели с тегами и сообщениями одинаковы

Я добавил таблицу в базу данных, имя которой - post_tagged, и в ней у меня есть два столбца post_id и tagged_id.

Таким образом, через эту таблицу будет происходить перенос отношений, если вы ее не создавали, она выдаст ошибку состояния SQL

1 Ответ

0 голосов
/ 10 декабря 2018

Насколько я понимаю, вы пытаетесь запрашивать сообщения на основе тегов, к которым они принадлежат.

Первое, что вы делаете неправильно, если у вас нет столбца tag_name в таблице записей, это то, что вы запрашиваете у таблиц записей tag_name, а не таблицу тегов.

public function search()
{
    $q = Input::get ( 'q' );

    //Use first instead of get incase of multiple results
    $tag = Tag::where('tag_name','LIKE','%'.$q.'%')->with('posts')->first();

    return view('guest.blog.search', compact('tag','q'));
}

Что вам нужно сделать, это запросить тег на основе его имени.Затем нетерпеливо загружаю все теги постов.Вам также не нужен условный оператор в контроллере.Вы можете иметь условный оператор в своем шаблоне блейда, например:

@if($tag->count())
    @if($tag->post->count())
        @foreach($tag->post as $post)
            {{$post->title}}
        @endforeach
    @else
        <h1>No posts found
    @endif
@else
    <h1>There was no tag. {{$q}}</h1>
@endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...