我想问一下是否可以一次在多个集合上使用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();
}
}
答案 0 :(得分:0)
您可以使用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]);
}
答案 1 :(得分:0)
您可以使用groupBy
对结果进行分组
$maxWeeksBack = 10;
$myPostCount = $user->posts()->where('created_at', '>', Carbon::now()->subWeek($maxWeeksBack))
->select('id', DB::raw('count(*) as total'))
->groupBy(DB::raw('WEEK(created_at)'))
->get();
$postCount = Post::where('created_at', '>', Carbon::now()->subWeek($maxWeeksBack))
->select('id', DB::raw('count(*) as total'))
->groupBy(DB::raw('WEEK(created_at)'))
->get();
这将以数组的形式返回帖子和myposts的计数,按周排序。您需要将两个数组合并以拥有您的数组,但这是一种获取帖子数的更简洁的方法。
免责声明:尚未对其进行实时测试,但它应该可以工作