首页 > 解决方案 > 使用 for 循环和多个 orWhen 为图表构建数组

问题描述

我正在使用此循环构建一个数组以在图表中显示当前一周中每一天的收视率

$ratings = collect([]);
$startOfWeek = Carbon::now()->startOfWeek();        
for ($days_forwards = 0; $days_forwards <= 6; $days_forwards++) {
            $ratings->push(Rating::whereIn('song_id', $userSongs)
                    ->orWhere(function ($query) use ($userAlbums) {
                        $query->whereIn('album_id', $userAlbums);
                    })
                    ->orWhere(function ($query) use ($userArtists) {
                        $query->whereIn('artist_id', $userArtists);
                    })
                    ->whereDate('created_at', $startOfWeek->addDays($days_forwards))
                    ->count());
            $startOfWeek = Carbon::now()->startOfWeek();
        }

这仅适用于第一个 whereIn,但是当我添加其他两个 orWhere 过滤器时,图表每天都会变平为 2 个结果。我无法弄清楚为什么会这样?

标签: mysqllaravelfor-loopcount

解决方案


所以我最终想通了,将 orWhere() 查询嵌套在第一个 where() 中,就像这样;

for ($days_forwards = 0; $days_forwards <= 6; $days_forwards++) {
            $ratings->push(Rating::where(function ($query) use ($userSongs, $userAlbums, $userArtists) {
                        $query->whereIn('song_id', $userSongs)
                        ->orWhere(function ($query) use ($userAlbums) {
                            $query->whereIn('album_id', $userAlbums);
                        })
                        ->orWhere(function ($query) use ($userArtists) {
                            $query->whereIn('artist_id', $userArtists);
                        });
                    })
                    ->whereDate('created_at', $startOfWeek->addDays($days_forwards))
                    ->count());
            $startOfWeek = Carbon::now()->startOfWeek();
        }

推荐阅读