/**
* @description 根据条件获取数据
* @param $where
* @return array
* @author swoole
* @date 2022/8/5 15:24
*/
public function findOne($where){
if (empty($where)) {
return false;
}
return self::where($where)->get()->toArray();
}
//跟进ids查询所有数据
public function findAll($data){
if (empty($data)) {
return false;
}
return self::find($data)->toArray();
}
//批量编辑
public function updateBatch($multipleData = [])
{
try {
if (empty($multipleData)) {
return false;
}
$tableName = $this->table; // 表名
$firstRow = current($multipleData);
$updateColumn = array_keys($firstRow);
// 默认以id为条件更新,如果没有ID则以第一个字段为条件
$referenceColumn = isset($firstRow['id']) ? 'id' : current($updateColumn);
unset($updateColumn[0]);
// 拼接sql语句
$updateSql = "UPDATE " . $tableName . " SET ";
$sets = [];
$bindings = [];
foreach ($updateColumn as $uColumn) {
$setSql = "`" . $uColumn . "` = CASE ";
foreach ($multipleData as $data) {
$setSql .= "WHEN `" . $referenceColumn . "` = ? THEN ? ";
$bindings[] = $data[$referenceColumn];
$bindings[] = $data[$uColumn];
}
$setSql .= "ELSE `" . $uColumn . "` END ";
$sets[] = $setSql;
}
$updateSql .= implode(', ', $sets);
$whereIn = collect($multipleData)->pluck($referenceColumn)->values()->all();
$bindings = array_merge($bindings, $whereIn);
$whereIn = rtrim(str_repeat('?,', count($whereIn)), ',');
$updateSql = rtrim($updateSql, ", ") . " WHERE `" . $referenceColumn . "` IN (" . $whereIn . ")";
// 传入预处理sql语句和对应绑定数据
return DB::update($updateSql, $bindings);
} catch (\Exception $e) {
return false;
}
}
//批量编辑或者添加,相当于tp 的saveAll
public function batchInsertOrUpdate($data){
try {
if (empty($data)) {//如果传入数据为空 则直接返回
return [
'insertNum' => 0,
'updateNum' => 0
];
}
$table = $this->table; //如果未传入table则通过对象获得
$columns = $this->getColumnListing(); //如果未传入table则通过对象获得
//拼装sql
$sql = "insert into " . $table . " (";
foreach ($columns as $k => $column) {
$sql .= $column . " ,";
}
$sql = trim($sql, ',');
$sql .= " ) values ";
foreach ($data as $k => $v) {
$sql .= "(";
foreach ($columns as $kk => $column) {
if ('updated_at' == $column) { //如果库中存在,create_at字段会被更新
$sql .= " '" . date('Y-m-d H:i:s') . "' ,";
} else {
$val = ''; //插入数据中缺少$colums中的字段时的默认值
if (isset($v[$column])) {
$val = $v[$column];
//$val = addslashes($val); //在预定义的字符前添加反斜杠的字符串。
}
$sql .= " '" . $val . "' ,";
}
}
$sql = trim($sql, ',');
$sql .= " ) ,";
}
$sql = trim($sql, ',');
$sql .= "on duplicate key update ";
foreach ($columns as $k => $column) {
$sql .= $column . " = values (" . $column . ") ,";
}
$sql = trim($sql, ',');
$sql .= ';';
$columnsNum = count($data);
$retNum = DB::update(DB::raw($sql));
$updateNum = $retNum - $columnsNum;
$insertNum = $columnsNum - $updateNum;
return [
'insertNum' => $insertNum,
'updateNum' => $updateNum
];
}catch (\Exception $e){
return false;
}
}
laveral 8 查询所有,批量插入
于 2022-08-05 17:31:47 首次发布