【问题标题】:Laravel 5.2 Search all records but return only parent elements' dataLaravel 5.2 搜索所有记录但只返回父元素的数据
【发布时间】: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 方式

谁能指出我正确的方向?

【问题讨论】:

    标签: php laravel relation


    【解决方案1】:
    class Post extends Model{
    public function children()
    {
        return $this->hasMany(Post::class, '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(Post::class, 'id', 'parent_post_id');
    }
    public function author()
    {  
       return $this->hasOne(User::class, 'id', 'user_id');
    }
    }
    
    
    
      $posts = Post::with(['children_count', 'author', 'children'])
            ->whereHas('author', function ($query) use ($search_term) {
                $query->where('name', 'like', '%' . $search_term . '%');
            })
            ->orWhere('content','like','%' . $search_term . '%')
            ->orderBy('created_at', 'desc')
            ->paginate(10);
    

    【讨论】:

    • Sarnodeep 谢谢你的尝试。请查看我的编辑,我添加了另一个解释。您的查询正在搜索作者的姓名,此时与我无关。每个帖子都有我需要搜索的“名称”和“内容”字段。我尝试在“儿童”查询中使用 whereHas,然后还返回儿童数据
    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 2021-12-04
    • 2019-12-27
    • 1970-01-01
    • 2017-10-15
    • 2015-06-13
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多