foreach ($events_id as $id) {
$vis = $visitors->where('event_id', $id);
array_push($men, $vis->where('sex', 'male')->count());
array_push($women, $vis->where('sex', 'female')->count());
array_push($kids, $vis->where('sex', 'kids')->count());
}
我收集了访客和活动 ID,我想检查每个活动中有多少男性、女性和儿童
它有效,但我想要更快的东西
这可以通过您的数据库查询直接完成,但我不知道您为什么不遵循它。 但在这种情况下,我们只能通过(if-else 或样本)条件来加快速度。
IF-ELSE 条件:
foreach ($events_id as $id) {
$vis = $visitors->where('event_id', $id);
if($vis->sex == 'male'){
array_push($men, $vis->count());
}else if($vis->sex == 'female'){
array_push($women, $vis->count());
}else{
array_push($kids, $vis->count());
}
样本状况:
foreach ($events_id as $id) {
$vis = $visitors->where('event_id', $id);
switch ($vis->sex) {
case 'male':
array_push($men, $vis->count());
break;
case 'female':
array_push($women, $vis->count());
break;
default:
array_push($kids, $vis->count());
break;
}
您可以按性别对结果进行分组,然后计算每组中有多少行。
SELECT sex, COUNT(sex) as count FROM test.test
WHERE event_id = 0
GROUP BY sex
;
好的试试这个:
$male_count = $visitors->whereIn('event_id', $events_id)->where('sex','male')->count();
$female_count = $visitors->whereIn('event_id', $events_id)->where('sex','female')->count();
$kids_count = $visitors->whereIn('event_id', $events_id)->where('sex','kids')->count();
它将在 IA 上工作。
答案是使用这样的查询来获取每个事件中男性、女性和儿童的数量
DB::table('visitors')
->select('visitors.sex', 'event_visitor.event_id', DB::raw('count(*) as num_visits'))
->join('event_visitor','visitors.id','=','event_visitor.visitor_id')
->whereIn('event_visitor.event_id',[1,2,3,4,5])
->groupBy('visitors.sex','event_visitor.event_id')
->get();
为了获得更好的性能,最好使用整数而不是字符串来定义性别。
此外,如果您可以修改数据库查询,那么直接通过查询获取这些数据将会很有趣。
你可以这样尝试:
# App/Models/Event
{
function male_visitors() {
$this->belongsToMany(Visitor::class)->where('sex', 'male');
}
# Add each gender here
}
您的查询现在可以如下所示:
Event::withCount(['male_visitors'])->get();