有什么方法可以重构得更快

问题描述 投票:0回答:5
   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,我想检查每个活动中有多少男性、女性和儿童

它有效,但我想要更快的东西

php arrays laravel collections laravel-query-builder
5个回答
0
投票

这可以通过您的数据库查询直接完成,但我不知道您为什么不遵循它。 但在这种情况下,我们只能通过(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;
        }

0
投票

您可以按性别对结果进行分组,然后计算每组中有多少行。

SELECT sex, COUNT(sex) as count FROM test.test
WHERE event_id = 0
GROUP BY sex
;

0
投票

好的试试这个:

$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 上工作。


0
投票

答案是使用这样的查询来获取每个事件中男性、女性和儿童的数量

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();

0
投票

为了获得更好的性能,最好使用整数而不是字符串来定义性别。

此外,如果您可以修改数据库查询,那么直接通过查询获取这些数据将会很有趣。

你可以这样尝试:

# App/Models/Event

{
    function male_visitors() {
        $this->belongsToMany(Visitor::class)->where('sex', 'male');
    }

    # Add each gender here
}

您的查询现在可以如下所示:

Event::withCount(['male_visitors'])->get();
© www.soinside.com 2019 - 2024. All rights reserved.