我有帖子模型和标签模型,我需要进行搜索查询,以便用户输入标签,然后该函数获取此标签并显示所有相关的帖子,因此,关系很多的帖子属于多个标签和标签属于很多职位,所以我声明了关系船,但是我找不到一种使关系船的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_id
和tagged_id
。
因此,如果您未创建关系表,它将通过此表发生,它将引发SQL状态错误
答案 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