如何划分要由 CodeIgniter 的 update_batch() 和 insert_batch() 执行的传入数据行?
How to divide incoming rows of data to be executed by CodeIgniter's update_batch() and insert_batch()?
我的objective是结合使用CodeIgniter的insert_batch()
和update_batch()
将传入数据添加到我的macro_plan
table.
在下面的脚本中,我尝试根据 sr_no
值查询数据库中的现有行,然后适当地调用批量查询方法。
function insert_batch($dataSet)
{
$query = $this->db->query("select sr_no from macro_plan");
$data = $query->result_array();
$sr_nos=array();
foreach($data as $key => $value):
$sr_nos[$key]=$value['sr_no'];
endforeach;
$query1= $this->db->query("select * from macro_plan WHERE sr_no IN ('".$sr_nos."')");
$update_query = $query1->result();
if ($update_query->num_rows() > 0) {
$this->db->update_batch($dataSet,$this->macro_plan);//update if ids exist
} else {
$this->db->insert_batch($dataSet,$this->macro_plan);//insert if does not exist
}
}
但是,我收到 "array to string conversion" 错误。
$dataset
类似于:
Array (
[0] => Array (
[quantity_update] => 88
[sr_no] => 2020-11-1
[batch] => Batch 2
[quantity_date_update] => 05-May-20
[inq_id] => 49
)
[1] => Array (
[quantity_update] => 99
[sr_no] => 2020-11-2
[batch] => Batch 1
[quantity_date_update] => 11-May-20
[inq_id] => 49
)
)
我的 table 结构如下所示:
- 查询您的 table 以查找包含
$dataSet
. 中存在的 sr_no
值的预先存在的行
- 然后将键应用于来自
sr_no
值的结果集行——这允许 swift 根据旧数据查找新数据(以查看是否应插入相应的新行,作为更新执行,或完全忽略,因为数据相同。
未经测试的建议:
function insertUpdateMacroPlan($dataSet)
{
$keyedExistingRows = array_column(
$this->db
->where_in('sr_no', array_column($dataSet, 'sr_no'))
->get('macro_plan')
->result_array(),
null,
'sr_no'
);
foreach ($dataSet as $data) {
if (isset($keyedExistingRows[$data['sr_no']])) {
// sr_no exists in the db, add known id to new data array
$identified = ['id' => $keyedExistingRows[$data['sr_no']]['id']] + $data;
if ($identified != $keyedExistingRows[$data['sr_no']]) {
$updateBatch[] = $identified;
}
// if the arrays contain the same data, the new data will be discarded
} else {
$insertBatch[] = $data;
}
}
if (!empty($insertBatch)) {
$this->db->insert_batch('macro_plan', $insertBatch);
}
if (!empty($updateBatch)) {
$this->db->update_batch('macro_plan', $updateBatch, 'id');
}
}
p.s。如果您的业务逻辑要求 sr_no
值是唯一的,我建议您通过将 sr_no
列设置为唯一键来在 table 配置中反映这一点。
我的objective是结合使用CodeIgniter的insert_batch()
和update_batch()
将传入数据添加到我的macro_plan
table.
在下面的脚本中,我尝试根据 sr_no
值查询数据库中的现有行,然后适当地调用批量查询方法。
function insert_batch($dataSet)
{
$query = $this->db->query("select sr_no from macro_plan");
$data = $query->result_array();
$sr_nos=array();
foreach($data as $key => $value):
$sr_nos[$key]=$value['sr_no'];
endforeach;
$query1= $this->db->query("select * from macro_plan WHERE sr_no IN ('".$sr_nos."')");
$update_query = $query1->result();
if ($update_query->num_rows() > 0) {
$this->db->update_batch($dataSet,$this->macro_plan);//update if ids exist
} else {
$this->db->insert_batch($dataSet,$this->macro_plan);//insert if does not exist
}
}
但是,我收到 "array to string conversion" 错误。
$dataset
类似于:
Array (
[0] => Array (
[quantity_update] => 88
[sr_no] => 2020-11-1
[batch] => Batch 2
[quantity_date_update] => 05-May-20
[inq_id] => 49
)
[1] => Array (
[quantity_update] => 99
[sr_no] => 2020-11-2
[batch] => Batch 1
[quantity_date_update] => 11-May-20
[inq_id] => 49
)
)
我的 table 结构如下所示:
- 查询您的 table 以查找包含
$dataSet
. 中存在的 - 然后将键应用于来自
sr_no
值的结果集行——这允许 swift 根据旧数据查找新数据(以查看是否应插入相应的新行,作为更新执行,或完全忽略,因为数据相同。
sr_no
值的预先存在的行
未经测试的建议:
function insertUpdateMacroPlan($dataSet)
{
$keyedExistingRows = array_column(
$this->db
->where_in('sr_no', array_column($dataSet, 'sr_no'))
->get('macro_plan')
->result_array(),
null,
'sr_no'
);
foreach ($dataSet as $data) {
if (isset($keyedExistingRows[$data['sr_no']])) {
// sr_no exists in the db, add known id to new data array
$identified = ['id' => $keyedExistingRows[$data['sr_no']]['id']] + $data;
if ($identified != $keyedExistingRows[$data['sr_no']]) {
$updateBatch[] = $identified;
}
// if the arrays contain the same data, the new data will be discarded
} else {
$insertBatch[] = $data;
}
}
if (!empty($insertBatch)) {
$this->db->insert_batch('macro_plan', $insertBatch);
}
if (!empty($updateBatch)) {
$this->db->update_batch('macro_plan', $updateBatch, 'id');
}
}
p.s。如果您的业务逻辑要求 sr_no
值是唯一的,我建议您通过将 sr_no
列设置为唯一键来在 table 配置中反映这一点。