【问题标题】:Eloquent relation query not functioning雄辩的关系查询不起作用
【发布时间】:2021-05-12 06:37:57
【问题描述】:

我对这个数据库查询摸不着头脑,不知道为什么它不起作用。

如果我直接在plays 表上尝试它确实有效:

Play::select(\DB::raw('COUNT(*) as plays'), \DB::raw('DATE(created_at) as date'))
      ->whereDate('created_at', '>', Carbon::now()->subWeek())
       ->groupBy('date')->orderBy('date')->get();
// returns the expected results

但是,当我尝试在关系函数中使用它时它不起作用(返回空数组,而实际上有数据):

 $artist->songs()->with(['plays' => function($q){
     $q->select(\DB::raw('COUNT(*) as plays'), \DB::raw('DATE(created_at) as date'))
       ->whereDate('created_at', '>', Carbon::now()->subWeek())
       ->groupBy('date')->orderBy('date');
  }])->get()->pluck('plays')->toArray();

注意:$artist->songs()->with('plays')->get()返回预期结果

【问题讨论】:

  • 这是什么关系类型?多对多?
  • @apokryfos 不,艺术家有很多歌曲 |歌曲属于艺术家 |歌曲有很多次播放
  • 为了使急切加载关系起作用,您需要在基于关系逻辑的急切加载逻辑上具有父或子的 id。由于您在关系逻辑上有一个特定的select 而没有song_id ,因此它将不起作用,(而且我认为您不能在 group by 上选择 id)如果您在没有 groupBy 的情况下获取播放并将其分组会更好关于检索到的集合

标签: mysql laravel eloquent


【解决方案1】:

我猜你需要在select 声明中发送id

   $artist->songs()->with(['plays' => function($q){
    $q->select(\DB::raw('COUNT(*) as plays'), \DB::raw('DATE(created_at) as date'), 'id')
   ->whereDate('created_at', '>', Carbon::now()->subWeek())
   ->groupBy('date')->orderBy('date');
   }])->get()->pluck('plays')->toArray();

【讨论】:

  • 遗憾的是,结果相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2019-08-13
  • 1970-01-01
  • 2021-06-17
  • 2016-07-01
  • 2020-08-27
相关资源
最近更新 更多