数据导出 toArray

数据导出

模型通常要导出成不同格式,例如,你可能想将模型的一个集合转成JSON或Excel格式, 导出过程可分解为两个步骤:

  • 模型转换成数组;
  • 数组转换成所需要的格式。

你只需要关注第一步,因为第二步可被通用的 数据转换器如yii\web\JsonResponseFormatter来完成。

将模型转换为数组最简单的方式是使用 yii\base\Model::attributes() 属性, 例如:

$post = \app\models\Post::findOne(100);
$array = $post->attributes;

yii\base\Model::attributes() 属性会返回 Model里所有 申明的属性的值(model表对应的所有字段)。

更灵活和强大的将模型转换为数组的方式是使用 yii\\base\\Model::toArray() 方法, 它的行为默认和 yii\\base\\Model::attributes() 相同, 但是它允许你选择哪些称之为_字段_的数据项放入到结果数组中并同时被格式化。 实际上,它是导出模型到 RESTful 网页服务开发的默认方法, 详情请参阅响应格式.

字段

字段是模型通过调用 yii\\base\\Model::toArray() 生成的数组的单元名。

默认情况下,字段名对应属性名,但是你可以通过覆盖 fields()extraFields()方法来改变这种行为, 两个方法都返回一个字段定义列表,fields() 方法定义的字段是默认字段, 表示toArray()方法默认会返回这些字段。 extraFields()方法定义额外可用字段, 通过toArray()方法指定$expand参数来返回这些额外可用字段。 例如如下代码会返回fields()方法定义的所有字段和extraFields()方法定义的prettyName and fullAddress字段。

$array = $model->toArray([], ['prettyName', 'fullAddress']);

可通过覆盖 fields() 来增加、删除、重命名和重定义字段, fields() 方法返回值应为数组, 数组的键为字段名,数组的值为对应的可为属性名或匿名函数返回的字段定义对应的值。 特使情况下,如果字段名和属性定义名相同,可以省略数组键, 例如:

// 明确列出每个字段,特别用于你想确保数据表或模型
// 属性改变不会导致你的字段改变(保证后端的API兼容)。
public function fields()
{
    return [
        // 字段名和属性名相同
        'id',

        // 字段名为 "email",对应属性名为 "email_address"
        'email' => 'email_address',

        // 字段名为 "name", 值通过PHP代码返回
        'name' => function () {
            return $this->first_name . ' ' . $this->last_name;
        },
    ];
}

// 过滤掉一些字段,特别用于
// 你想继承父类实现并不想用一些敏感字段
public function fields()
{
    $fields = parent::fields();

    // 去掉一些包含敏感信息的字段
    unset($fields['auth_key'], $fields['password_hash'], $fields['password_reset_token']);

    return $fields;
}

**警告: **由于模型的所有属性会被包含在导出数组,最好检查数据确保没包含敏感数据, 如果有敏感数据,应覆盖 fields() 方法过滤掉, 在上述列子中,我们选择过滤掉 auth_keypassword_hash and password_reset_token

实例

返回指定的字段:id, app_tile , app_mark, project_id

其中 app_tile 在model模型中的属性为 title

### 控制器
$model = VbbTask::findOne(1380);
$model->toArray([], ['project_id']);

### model重写 fields, extraFields

public function fields()
{
	if (\Yii::$app->getRequest()->getIsPost()) {
		 return [
           'id', //段名和属性名相同
           'sub_titile' => 'title',// 字段名为 "sub_titile",对应属性名为 "title"
           'app_mark' => function() {
                return '这里函数处理后的返回值';
           },
		   'nickname' => function() {
				//给昵称加前缀 nick_,返回给客户端
			   $post = \Yii::$app->getRequest()->post();
			   return 'nick_' . $post['nickname'];
			},
		  
	} else {
		return parent::fields();
	}



public function extraFields()
{

	return [
		'project_id',
	];
}

需要对返回的字段名,或者返回值做二次处理,就可以用以上的方法

### 如何从 ASP 数据库中导出数据的最佳实践 为了实现从 ASP.NET 应用程序连接的数据库中导出数据的功能,可以采用以下方法: #### 使用 ClosedXML 导出 Excel 文件 在 ASP.NET Core 中,可以通过安装 `ClosedXML` NuGet 包来轻松处理 Excel 文档。此工具允许开发者以简单的方式操作 Excel 表格并将其作为文件下载给用户[^1]。 以下是具体的操作方式以及代码示例: 1. **创建新的 ASP.NET Core MVC 项目** 需要在 Visual Studio 中新建一个 ASP.NET Core Web Application 并选择 MVC 模板。 2. **安装必要的依赖项** 执行以下命令以安装所需的 NuGet 包: ```bash dotnet add package ClosedXML --version 0.97.0 ``` 3. **编写控制器逻辑** 下面是一个简单的 Controller 方法用于读取数据库并将结果写入 Excel 文件。 假设有一个名为 `DbContext` 的 EF Core 上下文类,并且其中包含了一个实体集合 `MyEntities`。 ```csharp using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.IO; using ClosedXML.Excel; public class ExportController : Controller { private readonly ApplicationDbContext _context; // 替换为实际 DbContext 类型 public ExportController(ApplicationDbContext context) { _context = context; } public IActionResult DownloadExcel() { var data = _context.MyEntities.ToList(); // 查询数据库获取数据 using (var workbook = new XLWorkbook()) { var worksheet = workbook.Worksheets.Add("Data"); worksheet.Cell(1, 1).Value = "Column1"; // 设置表头 worksheet.Cell(1, 2).Value = "Column2"; int row = 2; foreach (var item in data) { worksheet.Cell(row, 1).Value = item.Property1; // 替换为实际属性名 worksheet.Cell(row, 2).Value = item.Property2; row++; } using (var stream = new MemoryStream()) { workbook.SaveAs(stream); var content = stream.ToArray(); return File(content, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "ExportedData.xlsx"); } } } } ``` 4. **视图配置** 创建一个按钮或者链接指向上述 Action 方法以便触发导出功能: ```html <a href="/export/downloadexcel">Download Excel</a> ``` 通过以上步骤即可完成基本的数据导出需求。 --- #### 处理 AJAX 请求保存至数据库的情况 如果涉及到前端发送 AJAX 请求将数据传递回服务器端再存储到数据库,则需要注意请求格式化与验证过程[^2]。下面提供一段通用的 C# 后台接收 JSON 数据并通过 Entity Framework 存储的例子: ```csharp [HttpPost] public async Task<IActionResult> SaveData([FromBody] List<MyEntity> entities) { if (entities == null || !ModelState.IsValid) return BadRequest(ModelState); try { _context.MyEntities.AddRange(entities); // 添加多个对象实例 await _context.SaveChangesAsync(); return Ok(new { message = "Saved successfully!" }); } catch (Exception ex) { return StatusCode(StatusCodes.Status500InternalServerError, $"Internal server error: {ex.Message}"); } } ``` 对于客户端部分可利用 jQuery 实现如下调用: ```javascript $.ajax({ url: '/api/savedata', type: 'POST', contentType: 'application/json', data: JSON.stringify(dataArray), // dataArray 是要提交的对象数组 success: function(response){ console.log('Success:', response.message); }, error: function(error){ console.error('Error occurred', error.responseText); } }); ``` --- #### 总结 综合来看,在 ASP.NET Core 环境下导出数据库记录到 Excel 或者接受来自用户的输入更新后台都属于常见业务场景之一。合理运用现代框架特性能够极大简化开发流程同时提高效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值