Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Laravel雄辩的语言处理对话_Php_Mysql_Laravel_Eloquent - Fatal编程技术网

Php 使用Laravel雄辩的语言处理对话

Php 使用Laravel雄辩的语言处理对话,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我无路可走。我希望这里有人能给我指出正确的方向 每个用户都有一个统计行,其中包含他们的好友数、好友请求数、新消息数和消息数。从这个表中选择一行要快得多,而不是执行一个包含连接等的大型查询来检索每个页面加载的用户统计信息 这里的问题是,每一条新的对话消息都需要更新该行。如果我只是更新一行,这并不是一个真正的问题。一次对话可能有多个参与者(以20人为例) 我需要更新统计表中的20行。这被认为是一个坏主意,因为它会导致阻塞其他用户的请求。可以理解。 我需要更新会话参与者表中的20行(has_read

我无路可走。我希望这里有人能给我指出正确的方向

每个用户都有一个统计行,其中包含他们的好友数、好友请求数、新消息数和消息数。从这个表中选择一行要快得多,而不是执行一个包含连接等的大型查询来检索每个页面加载的用户统计信息

这里的问题是,每一条新的对话消息都需要更新该行。如果我只是更新一行,这并不是一个真正的问题。一次对话可能有多个参与者(以20人为例)

我需要更新统计表中的20行。这被认为是一个坏主意,因为它会导致阻塞其他用户的请求。可以理解。 我需要更新会话参与者表中的20行(has_read flag、has_deleted flag,以及可能在参与者“重新恢复”到会话时创建的)。好的,我总共在每封新邮件上更新了40行。。。听起来有点过分,但还不止于此

在eloquent中更新行并不简单。我也不知道如何以雄辩的方式进行批量更新,因此代码的结尾如下:

foreach ($conversation->participants as $participant) {
    if ($participant->user_id == Auth::user()->id) {
        continue;
    }

    $participant->has_read = 0;

    if ($participant->has_deleted == 1) {
        $participant->has_deleted = 0;
        $participant->created_at = DB::Raw('NOW()');
    }

    $participant->save();
    $participant->user->stats->new_messages += 1;
    $participant->user->stats->save();
}
ParticipantModel::whereIn('id',$array_of_id)->update($data_to_update);
因此,我已经执行了至少40个查询。更不用说用户本身并不急于加载。。。我真的不知道如何在关系中加载它们,所以每次发送新消息时,我都会以雄辩的方式执行至少60个查询。我不知道你是怎么想的,但对我来说那是一种畏缩


所以基本上,我不确定如何处理整个统计方面的事情和批量更新。我感觉自己好像撞到了一堵砖墙,我不知道该做什么,也不知道该转向哪里。请帮忙,谢谢。

一般来说,这是批量作业的步骤:

1) 迭代所有数据,并形成一个包含所有需要更新的内容的数组

2) 迭代时,形成要更新行的另一个id数组

3) 有了这两个数组,就可以使用where和elokent的更新来进行大规模赋值

大概是这样的:

foreach ($conversation->participants as $participant) {
    if ($participant->user_id == Auth::user()->id) {
        continue;
    }

    $participant->has_read = 0;

    if ($participant->has_deleted == 1) {
        $participant->has_deleted = 0;
        $participant->created_at = DB::Raw('NOW()');
    }

    $participant->save();
    $participant->user->stats->new_messages += 1;
    $participant->user->stats->save();
}
ParticipantModel::whereIn('id',$array_of_id)->update($data_to_update);
$data\u to\u更新数组应仅包含表中存在的字段

简化您的示例,为了便于解释,以下是如何执行上述步骤:

$array_of_id = array();
$data_to_update = array();

foreach ($conversation->participants as $participant) {
    $array_od_id[] = $participant['id'] //Pushing the ids into the array
    $participant['has_read'] = 0;
    if ($participant['has_deleted'] == 1) {
        $participant['has_deleted'] = 0;
        $participant['created_at'] = DB::Raw('NOW()');
    }
    $data_to_update[] = $participant; //Pushing each participant into data_to_update
}

/* You can either use DB raw or model,if you have it */
ParticipantModel::whereIn('id',$array_of_id)->update($data_to_update);
优点是,现在您只需要进行一次DB查询来更新数据,而不是对每个记录进行更新查询

请注意,我简化了您的示例。您必须弄清楚如何扩展此逻辑以适应用户表更新