如何统计laravel中的数据使用关系?
How to count data use relationship in laravel?
Table user
示例:
id | name | status | first_name | last_name | create_at
Table post
示例:
id | title | name | description | user_id | status | create_at
在model user
中:
public function posts()
{
return $this->hasMany(Post::class);
}
在model post
中:
public function users()
{
return $this->belongsTo(Users::class);
}
在posttable数据库中,有一个status
列,三个值为1,2,3,现在我想统计有多少个status = 1 , 以及有多少 status = 2, 3
我有两种处理方法,就是使用关系或者调用post模型来处理
在 UserController.php
:
// The best way to try is relationship
$user = User::select(['id', 'name'])
->with(['posts:user_id'])
->where('type', 2)
->get();
或:
$user = User::select(['id', 'name'])
->where('type', 2)
->get();
foreach ($user as $val) {
$statusPublic[] = Posts::where('user_id', $val['id'])->where('status', '=', 1)->count();
$statusPrivate[] = Posts::where('user_id', $val['id'])->whereIn('status', [2, 3])->count();
}
我的问题是在 posts table 中它有 300,000 个项目。如果你像那样处理状态计数,它会非常慢。有时长达 20 秒。有什么方法可以改善吗?谢谢
你应该使用whereHas()
方法
User::where('type', 2)->whereHas('posts', function($q) {
$q->where('status', '=', 1);
})->count();
您需要使用withCount。
在模型用户中
public function posts_status_one()
{
return $this->hasMany(Post::class)->where('status', '=', 1);
}
public function posts_status_other()
{
return $this->hasMany(Post::class)->whereIn('status', [2, 3]);
}
现在在您的查询中
$user = User::select(['id', 'name'])
->withCount(['posts_status_one', 'posts_status_other'])
->where('type', 2)
->get();
通过使用 withCount 的 n + 1 查询,将减少到 3 查询。
Table user
示例:
id | name | status | first_name | last_name | create_at
Table post
示例:
id | title | name | description | user_id | status | create_at
在model user
中:
public function posts()
{
return $this->hasMany(Post::class);
}
在model post
中:
public function users()
{
return $this->belongsTo(Users::class);
}
在posttable数据库中,有一个status
列,三个值为1,2,3,现在我想统计有多少个status = 1 , 以及有多少 status = 2, 3
我有两种处理方法,就是使用关系或者调用post模型来处理
在 UserController.php
:
// The best way to try is relationship
$user = User::select(['id', 'name'])
->with(['posts:user_id'])
->where('type', 2)
->get();
或:
$user = User::select(['id', 'name'])
->where('type', 2)
->get();
foreach ($user as $val) {
$statusPublic[] = Posts::where('user_id', $val['id'])->where('status', '=', 1)->count();
$statusPrivate[] = Posts::where('user_id', $val['id'])->whereIn('status', [2, 3])->count();
}
我的问题是在 posts table 中它有 300,000 个项目。如果你像那样处理状态计数,它会非常慢。有时长达 20 秒。有什么方法可以改善吗?谢谢
你应该使用whereHas()
方法
User::where('type', 2)->whereHas('posts', function($q) {
$q->where('status', '=', 1);
})->count();
您需要使用withCount。
在模型用户中
public function posts_status_one()
{
return $this->hasMany(Post::class)->where('status', '=', 1);
}
public function posts_status_other()
{
return $this->hasMany(Post::class)->whereIn('status', [2, 3]);
}
现在在您的查询中
$user = User::select(['id', 'name'])
->withCount(['posts_status_one', 'posts_status_other'])
->where('type', 2)
->get();
通过使用 withCount 的 n + 1 查询,将减少到 3 查询。