php中避免循环查询数据库的方式
//查出小组的类型
$groupType = GroupType::select('id','title as name')->get()->toArray();
//取小组类型id的集合数组
$groupTypeIds = array_map(function ($item){
return $item['id'];
},$groupType);
//以小组类型分组查出小组类型和小组
$group = Group::select('id','name','typeId')
->whereIn('typeId',$groupTypeIds)
->get()
->groupBy('typeId')
->toArray();
//处理一下
foreach ($groupType as $k1 => $v1) {
$groupType[$k1]['children'] = array_key_exists($v1['id'], $group) ? $group[$v1['id']] : [];
}
在Model 里面写入方法:
public function addAll(Array $data){
return DB::table($this->getTable())->insert($data);
}
在控制器代码:
$data= [ ['name'=>'111'], ['name'=>'222'] ];
DB::table('xxx')->insert($data);
//或者使用时$user = new User();
$data= [ ['name'=>'222'], ['name'=>'222'] ];
$user->addAll($data);
//或者下面的方法:
$insertData = [];
foreach ($attributeModelObj as $key => $value) {
$insertData[$key]['media_id'] = $value['media_id'];
$insertData[$key]['category_id'] = $value['category_id'];
$insertData[$key]['subclass_id'] = $value['subclass_id'];
}
$videoAttribute = new VideoAttribute();
if ($videoAttribute->addAll($insertData)) { }
批量更新操作:
借签: https://blog.csdn.net/amazingdyd/article/details/68924623#
//test data
/*
$multipleData = array(
array(
'id' => 'My id' ,
'name' => 'My Name 2' ,
'date' => 'My date 2'
),
array(
'id' => 'Another id' ,
'name' => 'Another Name 2' ,
'date' => 'Another date 2'
)
)
*/
public function completeOrderStore(Request $request){
$ids = Input::get('ids'); //拿到逗号分隔的字符串,然后把他们变成数组
$arr = explode(',', $ids);
$multipleData = [];
foreach($arr as $a){ //组成例子那样的数组
$multipleData[] = ['id'=>$a,
'name'=>Input::get('name'.$a),
'mobile'=>Input::get('mobile'.$a),
'school'=>Input::get('school'.$a),
'email'=>Input::get('email'.$a),
'is_bill'=>Input::get('is_bill'.$a),
'address'=>Input::get('address'.$a),
'post_code'=>Input::get('post_code'.$a)
];
}
$res = $this->updateBatch('seats',$multipleData);
return Redirect::to('/enroll/myorder');
}
//同时更新多个记录,参数,表名,数组(别忘了在一开始use DB;)
public function updateBatch($tableName = "", $multipleData = array()){
if( $tableName && !empty($multipleData) ) {
// column or fields to update
$updateColumn = array_keys($multipleData[0]);
$referenceColumn = $updateColumn[0]; //e.g id
unset($updateColumn[0]);
$whereIn = "";
$q = "UPDATE ".$tableName." SET ";
foreach ( $updateColumn as $uColumn ) {
$q .= $uColumn." = CASE ";
foreach( $multipleData as $data ) {
$q .= "WHEN ".$referenceColumn." = ".$data[$referenceColumn]." THEN '".$data[$uColumn]."' ";
}
$q .= "ELSE ".$uColumn." END, ";
}
foreach( $multipleData as $data ) {
$whereIn .= "'".$data[$referenceColumn]."', ";
}
$q = rtrim($q, ", ")." WHERE ".$referenceColumn." IN (". rtrim($whereIn, ', ').")";
// Update
return DB::update(DB::raw($q));
} else {
return false;
}
}
larvale 批量更新别人写好的参考:
https://www.jb51.net/article/126461.htm
https://stackoverflow.com/questions/26133977/laravel-bulk-update
// 也可以借签下面的思想:
/**
* 这里会把数据组成以pnid为键的数组
*/
$oldKeyData = array_column($oldData,NULL,'pnid');
$update = [];
$insert = [];
foreach ( $product as $p) {
if ( isset($oldKeyData[$p['pnid']]) ) {
$updatep[] = $p;
} eles {
$insert[] = $p;
}
}
//进行更新和删除
PHP array_column() 用法
一般array_column 是获取二维数组的制定列,组成新的数组输出。
注意:可以制定第三个参数,指定输出数组的key
<?php
$arr = [
['id' => 11, 'name' => 'aa'],
['id' => 22, 'name' => 'bb',],
['id' => 44, 'name' => 'cc'],
['id' => 33, 'name' => 'dd']
];
// 示例1:
print_r(array_column($arr, 'name'));
// 运行结果:
Array
(
[0] => aa
[1] => bb
[2] => cc
[3] => dd
)
// 示例2:
print_r(array_column($arr,'name','id'));
// 运行结果:
(
[11] => aa
[22] => bb
[44] => cc
[33] => dd
)
// 示例3:
print_r(array_column($arr, null, 'name'));
// 运行结果:
Array
(
[aa] => Array
(
[id] => 11
[name] => aa
)
[bb] => Array
(
[id] => 22
[name] => bb
)
[cc] => Array
(
[id] => 44
[name] => cc
)
[dd] => Array
(
[id] => 33
[name] => dd
)
)