搜索和多对多关系

时间:2018-12-08 19:37:27

标签: php laravel relationship backend

我有帖子模型和标签模型,我需要进行搜索查询,以便用户输入标签,然后该函数获取此标签并显示所有相关的帖子,因此,关系很多的帖子属于多个标签和标签属于很多职位,所以我声明了关系船,但是我找不到一种使关系船的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 =标记的:: where('tag_name','LIKE','%'。$ q。'%')-> with('posts')-> get();               dd($ posts);               if(count($ posts)> 0)                   return view('guest.blog.search_result',['title'=>'Results'])-> withDetails($ posts)-> withQuery($ q);               否则返回视图('guest.blog.no_result',['title'=>'Results'])-> withMessage('未找到详细信息');           }

我标记和张贴的模型相同

我在数据库中添加了一个表,该表的名称为post_tagged,其中有两列post_idtagged_id

因此,如果您未创建关系表,它将通过此​​表发生,它将引发SQL状态错误

1 个答案:

答案 0 :(得分:0)

根据我的理解,您正在尝试根据帖子所属的标签查询帖子。

您做错的第一件事,除非您在发帖表上有一个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'));
}

您需要做的是根据标签名称查询标签。然后eager load所有标签发布。您也不需要控制器中的条件语句。您可以在刀片模板中包含条件语句,如下所示:

@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
相关问题