/**
* データからINSERTとUPDATEのSQL文を生成する
* @param string $tbl_name テーブル名
* @param array $data エンティティ配列型のデータ
* @return array|string[][]
*/
private function createInsertAndUpdate($tbl_name, $data){
if(empty($data)) return array();
// 列名群文字列を組み立て
$ent0 = current($data);
$keys = array_keys($ent0);
$clms_str = implode(',', $keys); // 列名群文字列
$inserts = array(); // INSERT SQLリスト
$updates = array(); // UPDATE SQLリスト
foreach($data as &$ent){
// IDが空ならINSERT文を組み立て
if(empty($ent['id'])){
$inserts[] = $this->makeInsertSql($tbl_name, $ent); // INSERT文を作成する
}
// IDが存在すればUPDATE文を組み立て
else{
$updates[] = $this->makeUpdateSql($tbl_name, $ent); // UPDATE文を作成する
}
}
unset($ent);
$res = [
'inserts' => $inserts,
'updates' => $updates,
];
return $res;
}
/**
* INSERT文を作成する
* @param string $tbl_name テーブル名
* @param array $ent 登録データのエンティティ
* @return string INSERT文
*/
private function makeInsertSql($tbl_name, &$ent){
$clms_str = '';
$vals_str = '';
foreach($ent as $field => $value){
if($value === null) continue;
$clms_str .= $field . ',';
$vals_str .= "'{$value}',";
}
// 末尾の一文字であるコンマを削る
$clms_str = mb_substr($clms_str,0,mb_strlen($clms_str)-1);
$vals_str = mb_substr($vals_str,0,mb_strlen($vals_str)-1);
$insert_sql = "INSERT INTO {$tbl_name} ({$clms_str}) VALUES ({$vals_str});";
return $insert_sql;
}
/**
* UPDATE文を作成する
* @param string $tbl_name テーブル名
* @param array $ent 登録データのエンティティ
* @return string UPDATE文
*/
private function makeUpdateSql($tbl_name, &$ent){
if(empty($ent['id'])) throw new Exception('makeUpdateSql: idが空です。');
$vals_str = '';
foreach($ent as $field => $value){
if($value === null) continue;
$vals_str .= "{$field}='{$value}',";
}
$vals_str = mb_substr($vals_str,0,mb_strlen($vals_str)-1);// 末尾の一文字であるコンマを削る
$update_sql = "UPDATE {$tbl_name} SET {$vals_str} WHERE id={$ent['id']}";
return $update_sql;
}
出力
array(2) { ["inserts"]=> array(3) { [0]=> string(97) "INSERT INTO tanukis (tanuki_name,tanuki_date,kemono_id) VALUES ('赤ダヌキ','2019-4-9','101');" [1]=> string(95) "INSERT INTO tanukis (tanuki_name,tanuki_date,kemono_id) VALUES ('ビッグダヌキ','','103');" [2]=> string(75) "INSERT INTO tanukis (tanuki_name,kemono_id) VALUES ('緑のタヌキ','0');" } ["updates"]=> array(3) { [0]=> string(105) "UPDATE tanukis SET id='2',tanuki_name='アオダヌキ',tanuki_date='2019-4-8',kemono_id='100' WHERE id=2" [1]=> string(103) "UPDATE tanukis SET id='3',tanuki_name='黒ダヌキ',tanuki_date='2019-4-10',kemono_id='102' WHERE id=3" [2]=> string(69) "UPDATE tanukis SET id='4',tanuki_name='ニホンタヌキ' WHERE id=4" } }