allocatr/application/admin/model/Worker.php
2025-03-10 20:30:39 +08:00

109 lines
2.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\admin\model;
use Exception;
use think\Db;
use think\Model;
use traits\model\SoftDelete;
class Worker extends Model
{
use SoftDelete;
// 表名
protected $name = 'worker';
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'datetime';
protected $dateFormat = 'Y-m-d H:i:s';
// 定义时间戳字段名
protected $createTime = 'create_time';
protected $updateTime = 'update_time';
protected $deleteTime = 'deletetime';
// 追加属性
protected $append = [
'status_text'
];
public function getStatusList()
{
return ['1' => __('Status 1'), '0' => __('Status 0')];
}
public function getStatusTextAttr($value, $data)
{
$value = $value ?: ($data['status'] ?? '');
$list = $this->getStatusList();
return $list[$value] ?? '';
}
public function area()
{
return $this->belongsTo('Area', 'area_id', 'id', [], 'LEFT')->setEagerlyType(0);
}
/**
* 批量插入数据到数据库
*
* @param string $table 数据表名
* @param array $data 待插入的数据
* @param int $batchSize 每次插入的数据量(默认 500
* @return int 成功插入的总行数
* @throws Exception 插入失败时抛出异常
*/
function batchInsert( array $data, int $batchSize = 500): int
{
if (empty($data)) {
throw new Exception('插入数据不能为空');
}
// 提取字段名(确保所有数据的字段一致)
$columns = array_keys($data[0]);
$columnList = implode(', ', $columns);
$placeholders = '(' . implode(', ', array_fill(0, count($columns), '?')) . ')';
$totalInserted = 0;
Db::startTrans();
try {
// 数据分批插入
foreach (array_chunk($data, $batchSize) as $chunk) {
$sql = "INSERT INTO {$this->getTable()} ({$columnList}) VALUES " . implode(', ', array_fill(0, count($chunk), $placeholders));
$stmt = $this->prepare($sql);
// 将数据展开填充
$values = [];
foreach ($chunk as $row) {
$values = array_merge($values, array_values($row));
}
if ($stmt->execute($values)) {
$totalInserted += $stmt->rowCount();
} else {
throw new Exception('批量插入失败');
}
}
Db::commit();
return $totalInserted;
} catch (Exception $e) {
Db::rollback();
throw new Exception('批量插入失败:' . $e->getMessage());
}
}
}