php - 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();
}
}
解决方案
您可以使用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]);
}
推荐阅读
- java - 如何在 Scala 中更改、替换或扩展 3rd-party Enum (Java)?
- laravel - Tailwind css laravel mix 添加字体
- sql - 为什么 MS SQL Server 在插入第二行时出错,但在第一行却没有?
- angular - 如何在同一组件上显示 2 个 ag-grid 网格
- android - 颤振资产图像在启动之前不会卸载?如何解决这个问题?
- c# - 需要为多个客户端配置 IIS。它们都将使用单一的代码库,但使用不同的应用程序池和数据库
- java - 执行 jcmd GC.class_stats 时会导致 STW 吗?
- java - 我如何创建抽象类的对象?
- r - 如何将宽格式存在/不存在数据转换为长格式?
- python - 没有同一张牌如何洗牌?