首页 > 解决方案 > Laravel 同时在多个集合中

问题描述

我想问一下是否可以一次在多个集合上使用 where 方法.. 更好地说,是否可以以某种方式简化这段代码,好吗?太感谢了。

$posts_per_weeks = array();

for($i = 10; $i > 0; $i--) {
    $my_posts = $user->posts()
        ->where('created_at', '>', Carbon::now()->subWeek($i))
        ->where('created_at', '<=', Carbon::now()->subWeek($i-1))
        ->count();
    $all_posts = Post::all()
        ->where('created_at', '>', Carbon::now()->subWeek($i))
        ->where('created_at', '<=', Carbon::now()->subWeek($i-1))
        ->count();
    array_push($posts_per_weeks, [$my_posts, $all_posts - $my_posts]);
}

方法 posts() 如下所示:

public function posts()
{
    if($this->hasAnyRole('broker|super-agent')) {
        $posts = $this->teams()->get()->map(function ($team) {
            return $team->posts->all();
        });
        if($this->hasRole('broker')) {
            $posts->push($this->hasMany('App\Post', 'broker_id')->get());
        }
        return $posts->collapse()->unique();
    } elseif($this->hasRole('admin')) {
        return Post::all();
    } else {
        return $this->hasMany('App\Post', 'agent_id')->get();
    }
}

标签: phplaravelloops

解决方案


您可以使用QueryScopes

Post.php

class Post
{
    public function scopeFromWeek($query, $week) {
        return $builder->where('created_at', '>', Carbon::now()->subWeek($week))
                       ->where('created_at', '<=', Carbon::now()->subWeek($week-1));
    }
}

在您的控制器中(或您使用此代码的任何地方)

$posts_per_weeks = [];

for($i = 10; $i > 0; $i--) {
    $my_posts = $user->posts()->fromWeek($i)->count();
    $all_posts = Post::fromWeek($i)->count();
    array_push($posts_per_weeks, [$my_posts, $all_posts - $my_posts]);
}

推荐阅读