【问题标题】:Query logic using eloquent to search data based on many to many relationship in laravellaravel 中基于多对多关系使用 eloquent 查询数据的查询逻辑
【发布时间】:2018-08-18 06:52:35
【问题描述】:

我有guidesareas 表,它们有多对多关系,所以我有另一个表来连接它们,命名为guidings。快速解释,在现实生活中,一个导游知道很多地区,一个地区可以被很多导游知道。 我想根据用户发送给控制器的一系列区域来搜索导游,但同时导游还必须在视图中提供他的领域专业知识(他知道)的信息。

如下表:

guides
   - id       integer, primary key
   - name     string

areas
   - id       integer, primary key
   - name     string

guidings
   - guide_id integer, foreign key
   - area_id  integer, foreign key

我已经设置了如下模型:

model guide
   public function guides()
   {
     return $this->belongsToMany('App\Area', 'guidings', 'guide_id', 'area_id');
   }

model area
   public function users()
   {
      return $this->belongsToMany('App\User', 'guidings', 'area_id', 'guide_id');
   }

我的控制器看起来像这样

$areas = [1, 2, 3]; //actually this array i get from request, it based on id of area

$guides = Guide::with('areas')->where('id', '>' , 0);
$countGuide = count(Guide::all());
for ($i=0; $i < $countGuide; $i++) {
     $guides = $guides->orWhere(); //i stuck in here
}
$guides = $guides->get();

return response()->json($guides); //the data will be sent to ajax in view

那么我如何根据用户发送给控制器的一系列区域搜索导游,但同时导游还必须在视图中提供他的区域专业知识(他知道)的信息。 有什么建议吗?谢谢

【问题讨论】:

  • 还有...问题是什么?
  • @ijustried 我如何根据用户发送给控制器的一系列区域搜索导游,但同时导游还必须提供他的领域专业知识(他知道)的信息视图
  • 指南必须链接到阵列中的所有区域还是仅链接到其中之一?
  • @RossWilson 所有区域,考虑只显示所有向导的属性和他的所有区域,但他的一个或所有区域必须在用户作为请求发送的数组中

标签: database laravel database-design eloquent relational-database


【解决方案1】:

如果指南不需要匹配所有区域,那么您可以使用以下内容:

return Guide::with('area')->whereHas('areas', function ($query) use ($areas) {
    $query->whereIn('id', $areas);
})->get();

如果指南必须匹配所有区域,那么您可以混合使用 where inhaving 来完成此操作:

$areas = [1, 2, 3];

return Guide::with('area')->whereExists(function ($query) use ($areas) {

    $query->select('guide_id')
        ->from('guidings')
        ->whereRaw('guide_id = guides.id')
        ->whereIn('area_id', $areas)
        ->groupBy('guide_id')
        ->havingRaw("COUNT(DISTINCT area_id) = " . count($areas));

})->get();

此外,如果您只想将指南作为 JSON 返回,那么您可以简单地从控制器返回集合,Laravel 会自动为您将其转换为 JSON(数组也是如此)。

【讨论】:

  • 感谢您帮助我。它实际上以不同的方式工作,它找到所有区域都在 $areas 数组中的指南。但相反,我希望它找到即使其中一个区域也在 $areas 数组中的指南。我的意思是出现的指南不一定要知道用户想要的所有领域。即使他们只知道 $areas 数组中的一个区域,他们也会出现。希望它会有意义。
  • @MulqanJunaidi 哦,对不起,当我在上面的 cmets 中询问您是否需要将它们链接到您所说的所有区域时。我会更新我的答案。
【解决方案2】:

如果guide_idarea_id 的每个组合只能有一个数据透视行,您可以使用这个:

$guides = Guide::whereHas('areas', function($query) use($areas) {
    $query->whereIn('areas.id', $productIds);
}, '=', count($areas))->with('areas')->get();

【讨论】:

  • 您能否就答案提供反馈?
猜你喜欢
  • 2017-11-03
  • 1970-01-01
  • 2014-10-31
  • 2013-09-14
  • 2019-01-15
  • 2020-05-13
  • 1970-01-01
  • 2021-03-21
  • 2018-11-02
相关资源
最近更新 更多