如何用PHP循环为MySQL中所有user_id批量存储相同Payload?
问题:批量插入通知数据到news表
前端有一个可填写标题、消息和日期的表单,点击提交后,数据会存入数据库news表,但user_id字段始终为NULL(未指定用户ID)。由于需要给大量用户发送通知,希望从user表中获取所有user_status为1的user_id,为每个用户插入相同的标题、消息和日期数据。
现有代码
function set_news($form_data) { $data = array( 'title' => $form_data['title'], 'message' => $form_data['message'], 'date' => $form_data['date'], ); $this->db->select('user_id')->from('user')->where('user_status', 1); $query = $this->db->get(); foreach ($query->result_array() as $val) { $value[$val['user_id']] = $val['user_id']; } $this->db->insert('news', $data); }
期望效果
插入后news表数据如下:
| title | message | date | user_id |
|---|---|---|---|
| Greeting | Hello | 12/06/23 | 1001 |
| Greeting | Hello | 12/06/23 | 1002 |
| Greeting | Hello | 12/06/23 | 1003 |
| Greeting | Hello | 12/06/23 | 1004 |
| Greeting | Hello | 12/06/23 | 1005 |
| Greeting | Hello | 12/06/23 | 1006 |
解决方案
原代码的问题在于:循环获取用户ID后未将其加入插入数据,且仅执行了一次插入操作,导致user_id始终为NULL。下面提供两种可行的修改方案:
方案1:循环单条插入
逐个为每个用户插入数据,逻辑简单直观:
function set_news($form_data) { // 定义基础数据模板 $base_data = array( 'title' => $form_data['title'], 'message' => $form_data['message'], 'date' => $form_data['date'], ); // 获取所有状态为1的用户ID $this->db->select('user_id')->from('user')->where('user_status', 1); $query = $this->db->get(); // 循环每个用户,插入带user_id的数据 foreach ($query->result_array() as $user) { $insert_data = $base_data; $insert_data['user_id'] = $user['user_id']; $this->db->insert('news', $insert_data); } }
方案2:批量插入(推荐)
将所有待插入数据整理为数组后一次性插入,减少数据库交互次数,性能更优:
function set_news($form_data) { // 定义基础数据模板 $base_data = array( 'title' => $form_data['title'], 'message' => $form_data['message'], 'date' => $form_data['date'], ); // 获取所有状态为1的用户ID $this->db->select('user_id')->from('user')->where('user_status', 1); $query = $this->db->get(); // 批量整理插入数据 $insert_batch = array(); foreach ($query->result_array() as $user) { $row = $base_data; $row['user_id'] = $user['user_id']; $insert_batch[] = $row; } // 执行批量插入(需确保数据数组非空) if (!empty($insert_batch)) { $this->db->insert_batch('news', $insert_batch); } }
内容的提问来源于stack exchange,提问作者philtatos
相关产品推荐
相关产品推荐

