foreach 里面增加数据,键值重复的问题
我快成了一个问题宝宝,但是还是想问,吸收前辈们的经验,想让自己能写出优雅的代码;
那么问题来了,假设我用了数据模型,创建了一个新增方法,然后foreach的时候,键值不自增咋办?
如果把模型初始化放到foreach里面,觉得增加了消耗,每次循环都要new一下;
所以有啥优雅的办法可以解决吗?
我是不是应该把editData写成静态方法?还是怎么样?
通用方法模型 BaseModels,代码:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class BaseModels extends Model
{
/**
* 通用新增、更新数据方法
* @param array $data 数据
*/
public function editData($data)
{
if (isset($data['_token'])) unset($data['_token']);
//获取主键
$pk = $this->primaryKey;
if (isset($data[$pk]) && $data[$pk]>0) {
//如果存在主键,则更新数据
$res = $this->where($pk, $data[$pk])->update($data);
} else{
//如果不存在主键,则新增数据
foreach ($data as $key=>$v) {
$this->$key = $v;
}
$res = $this->save();
}
return $this->$pk;
}
}
Menus 数据模型
namespace App\Models;
use App\Models\BaseModels;
// 继承通用模型
class Menus extends BaseModels
{
protected $table = 'menus';
}
控制器
namespace App\Http\Controllers;
use App\Models\MenusModels;
class AController extends Controller
{
public function index()
{
$data = [
[
'title' => 'a'
],
[
'title' => 'b'
],
[
'title' => 'c'
],
];
$Menus = new MenusModels();
foreach($data as $v) {
// 这么写的话,ID不会自增
// 可是如果把$Menus = new MenusModels(); 放到foreach里面,是不是就多了消耗?
// 我想能如何优雅的解决这个问题?
$Menus->editData($v)
}
}
}
editData 是一个新增和更新的通用方法;
意思是传进来的数据如果存在主键则更新,如果没有主键则新增。
你这个代码应该只会创建一条数据,后面两次遍历都是在修改第一条创建的数据
建议新建模型实例,如果感觉那点性能非常重要,你就这样写:
这样就可以复用模型实例!