【发布时间】:2017-02-17 11:12:55
【问题描述】:
我做了一个搜索功能,搜索数据库中所有帖子的名称和内容字段。其中一些帖子是相关的(父母和孩子)。我有一个问题,好像我的搜索在子帖子中返回了命中,我只想返回父数据(以最小化负载)。
我的帖子模型:
public function children()
{
return $this->hasMany('App\Post','parent_post_id','id');
}
public function children_count()
{
return $this->children()
->selectRaw('parent_post_id, count(*) as answers')
->groupBy('parent_post_id');
}
public function parents()
{
return $this->hasOne('App\Post','id','paren_post_id');
}
public function author()
{
return $this->hasOne('App\User', 'id', 'user_id');
}
我的搜索查询:
$posts = Post::with('children')
->with('children_count')
->with('author')
->where('name','like','%'.$search_term.'%')
->orWhere('content','like','%'.$search_term.'%')
->orderBy('created_at','desc')
->groupBy('id')
->paginate(10);
示例:Post#1 有两个孩子,Post#2 和 Post#3。我的搜索在 Post#3 中找到数据,现在我希望它返回 Post#1 的数据。
编辑: 我知道我需要更多地解释我到底想要实现什么。
帖子表结构:
- 身份证
- 姓名
- 蛞蝓
- 内容
- user_id
- parent_post_id
- updated_at
- created_at
我正在搜索每个帖子的名称和内容字段(作者(user_id)此时无关紧要)。当搜索在子帖子中找到命中时(已将 parent_post_id 设置为父 ID),我只想获取父数据(id、slug、名称、内容等)
我能够做到这一点:
$posts = DB::table('posts as a')
->leftJoin('posts as b', 'b.parent_post_id', '=', 'a.id')
->where('a.name','like','%'.$search_term.'%')
->orWhere('a.content','like','%'.$search_term.'%')
->orWhere('b.name','like','%'.$search_term.'%')
->orWhere('b.content','like','%'.$search_term.'%')
->select('a.*')->orderBy('a.created_at','desc')->paginate(10)
但随后无法成功计算返回的父级拥有的所有子级。这也可能会提供一些想法如何包装这种 Laravel 方式
谁能指出我正确的方向?
【问题讨论】: