Thinkphp 데이터 일괄 업데이트 방법 집계
방법 1:
// data field ci
function batch_update($table_name='',$data=array(),$field=''){
if(!$table_name||!$data||!$field){
return false;
}else{
$sql='UPDATE '.$table_name;
}
$con=array();
$con_sql=array();
$fields=array();
foreach ($data as $key => $value) {
$x=0;
foreach ($value as $k => $v) {
if($k!=$field&&!$con[$x]&&$x==0){
$con[$x]=" set {$k} = (CASE {$field} ";
}elseif($k!=$field&&!$con[$x]&&$x>0){
$con[$x]=" {$k} = (CASE {$field} ";
}
if($k!=$field){
$temp=$value[$field];
$con_sql[$x].= " WHEN '{$temp}' THEN '{$v}' ";
$x++;
}
}
$temp=$value[$field];
if(!in_array($temp,$fields)){
$fields[]=$temp;
}
}
$num=count($con)-1;
foreach ($con as $key => $value) {
foreach ($con_sql as $k => $v) {
if($k==$key&&$key<$num){
$sql.=$value.$v.' end),';
}elseif($k==$key&&$key==$num){
$sql.=$value.$v.' end)';
}
}
}
$str=implode(',',$fields);
$sql.=" where {$field} in({$str})";
$res=M($table_name)->execute($sql);
return $res;
}
//
function test(){
$update_array=array();
for ($i=2; $i <7 ; $i++) {
$data=array();
$data['id']=$i;
$data['memeber_type']=2;
$data['memeber_type_state']=1;
$update_array[]=$data;
}
$res=$this->batch_update('yl_member',$update_array,id);
var_dump($res);
}
방법 2:한 줄 한 줄 갱신 기록 을 순환 하 는 것 이다.기록 업 데 이 트 를 한 번 하면 성능 이 떨 어 지고 차단 되 기 쉽다.
그러면 sql 문 구 를 대량으로 업데이트 할 수 있 습 니까?my sql 은 대량 업 데 이 트 를 실현 하 는 직접적인 방법 을 제공 하지 않 았 지만 작은 기술 로 실현 할 수 있 습 니 다.
UPDATE categories
SET display_order = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END
WHERE id IN (1,2,3)
이 sql 의 뜻 은 display 업데이트order 필드,id=1 이면 displayorder 의 값 은 3 이 고 id=2 이면 displayorder 의 값 은 4 이 며,id=3 이면 displayorder 의 값 은 5 입 니 다.조건문 을 함께 쓴 것 이다.
이곳 의 where 부분 은 코드 의 실행 에 영향 을 주지 않 지만 sql 의 실행 효율 을 높 일 수 있 습 니 다.sql 문 구 는 수정 할 줄 만 실행 하도록 확보 합 니 다.여 기 는 3 개의 데이터 만 업데이트 되 고 where 자 구 는 3 줄 의 데이터 만 실행 하도록 확보 합 니 다.
여러 값 을 업데이트 하려 면 조금 만 수정 하 십시오:
UPDATE categories
SET display_order = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END,
title = CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END
WHERE id IN (1,2,3)
실제 운용
$display_order = array(
1 => 4,
2 => 1,
3 => 2,
4 => 3,
5 => 9,
6 => 5,
7 => 8,
8 => 9
);
$ids = implode(',', array_keys($display_order));
$sql = "UPDATE categories SET display_order = CASE id ";
foreach ($display_order as $id => $ordinal) {
$sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal);
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;
방법 2 는 사용 을 건의 하지 않 는 다.방법 3:
/*
* @param $saveWhere : ID
* @param $saveData : ID
* @param $tableName :
* @param $saveWhere : ID
* */
public function saveAll($saveWhere,&$saveData,$tableName){
if($saveWhere==null||$tableName==null)
return false;
// id
$key = array_keys($saveWhere)[0];
//
$len = count($saveWhere[$key]);
$flag=true;
$model = isset($model)?$model:M($tableName);
//
$model->startTrans();
// ID
$error=[];
for($i=0;$i<$len;$i++){
// sql
$isRight=$model->where($key.'='.$saveWhere[$key][$i])->save($saveData[$i]);
if($isRight==0){
//
$error[]=$i;
$flag=false;
}
//$flag=$flag&&$isRight;
}
if($flag ){
//
$model->commit();
return $saveWhere;
}elseif(count($error)>0&count($error)<$len){
//
$model->rollback();
for($i=0;$i<count($error);$i++){
// ID Data
unset($saveWhere[$key][$error[$i]]);
unset($saveData[$error[$i]]);
}
//
$saveWhere[$key]=array_merge($saveWhere[$key]);
$saveData=array_merge($saveData);
//
$this->saveAll($saveWhere,$saveData,$tableName);
return $saveWhere;
}
else{
//
$model->rollback();
return false;
}
}
테스트 방법 에서 호출:
public function test(){
//
$where['ID']=array(70,73,74,80,83);
//ID
$save=array(
array('School'=>'DK Univisity01','isExport'=>0),
array('School'=>'DK Univisity02','isExport'=>0),
array('School'=>'DK Univisity03','isExport'=>0),
array('School'=>'DK Univisity04','isExport'=>0),
array('School'=>'','isExport'=>0),
// array('School'=>' Univisity05','isExport'=>0),
);
$f=$this->saveAll($where,$save,'want');
if(count($f['ID'])>0){
// ID
echo "This is success :</br>";
dump($f);
echo 'ok';
}else{
//
echo "This is failed :</br>";
dump($f);
echo 'error';
}
}
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 Thinkphp 의 대량 업데이트 방법 을 모 은 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Thinkphp의 S 캐시 사용법!텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.