php - 使用 Laravel Eloquent 处理对话

标签 php mysql laravel eloquent

我无处可去。我希望这里有人能给我指明正确的方向。

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

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

我需要更新统计表中的 20 行。这被认为是一个坏主意,因为它会阻止其他用户发出请求。可以理解。 我将需要更新对话参与者表中的 20 行(has_read 标志、has_deleted 标志和可能的 created_at,因为参与者“恢复”到对话中)。好吧,我总共更新了每条新消息的 40 行...听起来有点矫枉过正,但它并不止于此。

在 Eloquent 中更新行并不简单。我也不知道如何在 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();
}

我已经执行了至少 40 个查询。更不用说用户本身并没有急切加载……不太确定如何在关系中急切加载它们,所以每次发送新消息时,我都会通过 Eloquent 方式执行至少 60 个查询。我不了解你,但对我来说这是一种畏缩。

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

最佳答案

通常这是为批量分配所做的:

1) 遍历所有数据并形成一个包含您需要更新的所有内容的数组

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

3)用这两个数组,用WhereIn做批量赋值,eloquent的更新。

像这样:

ParticipantModel::whereIn('id',$array_of_id)->update($data_to_update);

您的 $data_to_update 数组应该只包含表中存在的字段。

简化您的示例,为了便于解释,这是执行上述步骤的方法:

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

优点是现在您只需进行一个数据库查询来更新数据,而不是对每条记录进行更新查询。

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

关于php - 使用 Laravel Eloquent 处理对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31758592/

相关文章:

php - 需要动态添加复选框

php cli 不工作,找不到 pdo

javascript - php/mysql 动态下拉菜单的 AJAX RETURN 帮助

javascript - 从 Laravel 对象中获取对象

javascript - 无法将附加文件传递到 Controller : 422 Unprocessable Entity

java - REST API 聚合 实时

php - 在 Twitter 上自动关注

php - 加载数据 Infile OPTIONALLY ENCLOSED BY 未按预期工作

mysql - mysql中的DC2Type数组数据类型是什么

php - Laravel 5 - DB join 仅返回第一个表列集