• ExtJS 数据处理-Associations(关联)


    更新记录
    2022年7月21日 发布。
    2022年7月16日 从笔记迁移到博客。

    ExtJS教程汇总:https://www.cnblogs.com/cqpanda/p/16328016.html

    Associations(关联)

    关联说明

    模型(Model)可以与通过关联(Associations)联系在一起
    要定义实体之间的关系,支持的关联类型:
    一对一(One-to-One)
    一对多(One-to-Many)
    多对多(Many-to-Many)

    定义关联的方法

    hasMany 定义一对多关系
    hasOne 定义一对一关系
    manyToOne 定义多对一关系
    manyToMany 定义多对多关系
    belongTo 可以用来定义多对一关系
    associations 可以用来定义任何关系(已被弃用,不要再使用)

    一对一关联(One-to-One Associations)

    说明

    使用模型类下的字段的reference属性即可

    { name: '字段名称' , reference: '引用的Model名', unique: true }

    说明:unique表示唯一,如果不指定则关系为一对多

    实例:用户账号 和 员工信息

    1. //一个 用户账号 对应 一个员工信息
    2. //定义用户账号Model
    3. Ext.define('PandaApp.model.User', {
    4. extend: 'Ext.data.Model',
    5. idProperty: 'Id',
    6. identifier: {
    7. type: 'uuid'
    8. },
    9. fields: [
    10. { name: 'Id', type: 'int' },
    11. { name: 'UserName', type: 'string' },
    12. { name: 'Password', type: 'string' },
    13. //定义引用外部
    14. { name: 'UserInfo', reference: 'PandaApp.model.EmployeeInfo', unique: true }
    15. ]
    16. });
    17. //定义员工信息Model
    18. Ext.define('PandaApp.model.EmployeeModel', {
    19. extend: 'Ext.data.Model',
    20. idProperty: 'Id',
    21. identifier: {
    22. type: 'uuid'
    23. },
    24. fields: [
    25. { name: 'RealName', type: 'string' },
    26. { name: 'Age', type: 'int' },
    27. { name: 'WorkYear', type: 'int' }
    28. ]
    29. });
    30. //定义账号实例(直接内联外键数据)
    31. var userInstance1 = Ext.create('PandaApp.model.User', {
    32. UserName: 'Panda666',
    33. Password: '12345678',
    34. UserInfo: { //直接定义了对象,也可以引入外部对象
    35. RealName: 'Panda',
    36. Age: 666,
    37. WorkYear: 888
    38. }
    39. });
    40. //读取数据
    41. console.log(userInstance1.get('UserName'));
    42. console.log(userInstance1.get('Password'));
    43. console.log(userInstance1.get('UserInfo'));

    还可以引用外部已经定义好的Model实例

    1. //定义账号实例(关联外部数据)
    2. var employeeInfoInstance = Ext.create('PandaApp.model.EmployeeModel', {
    3. RealName: 'Panda',
    4. Age: 666,
    5. WorkYear: 888
    6. });
    7. var userInstance2 = Ext.create('PandaApp.model.User', {
    8. UserName: 'Panda666',
    9. Password: '12345678',
    10. UserInfo: employeeInfoInstance //引入外部对象
    11. });
    12. //读取数据
    13. console.log(userInstance2.get('UserName'));
    14. console.log(userInstance2.get('Password'));
    15. console.log(userInstance2.get('UserInfo'));

    一对多关联(One-To-Many Associations)

    说明

    使用hasMany配置项

    1. hasMany:[
    2. {
    3. model:'对应的Model名称',
    4. name:'本Model的外键字段',
    5. associationKey: '关联名称'
    6. }
    7. ]

    使用hasMany配置项可以定义关联
    使用name配置项可以定义模型的关联外部的字段,可选
    如果不定义name配置项,ExtJS将使用模型的名称+s的方式定义默认名称
    使用model配置项可以定义关联的模型
    使用associationKey定义关联的名称,可选,默认值等于name配置项
    注意:如果只有一个外键可以去掉数组符号

    使用reference配置项

    使用模型类下的字段的reference属性即可

    { name: '字段名称' , reference: '引用的Model名'}

    实例:定义老板和员工(一对多)

    1. //定义Boss Model
    2. Ext.define('PandaApp.model.Boss', {
    3. extend: 'Ext.data.Model',
    4. idProperty: 'Id',
    5. fields: [
    6. { name: 'Id', type: 'int' },
    7. { name: 'Name', type: 'string' }
    8. ],
    9. identifier: { //自动生成id字段的值
    10. type: 'uuid' //设置生成uuid
    11. },
    12. hasMany: { //定义一对多关联
    13. name: 'Employees', //字段名称
    14. model:'PandaApp.model.Employee', //关联的Model
    15. associationKey: 'Employees'
    16. }
    17. });
    18. //定义 Employee Model
    19. Ext.define('PandaApp.model.Employee', {
    20. extend: 'Ext.data.Model',
    21. idProperty: 'Id',
    22. fields: [
    23. { name: 'Id', type: 'int' },
    24. { name: 'Name', type: 'string' }
    25. ],
    26. identifier: {
    27. type: 'uuid'
    28. }
    29. });
    30. //定义boss Model实例
    31. var bossInstance = Ext.create('PandaApp.model.Boss', {
    32. Name: 'Panda666'
    33. });
    34. //定义Employee Model实例
    35. var employeeInstance1 = Ext.create('PandaApp.model.Employee', {
    36. Name: 'Dog'
    37. });
    38. var employeeInstance2 = Ext.create('PandaApp.model.Employee', {
    39. Name: 'Monkey'
    40. });
    41. //将Employee实例添加到boss实例中
    42. bossInstance.Employees().add(employeeInstance1);
    43. bossInstance.Employees().add(employeeInstance2);
    44. //读取自身字段
    45. console.log(bossInstance.get('Id'));
    46. console.log(bossInstance.get('Name'));
    47. //读取外部字段
    48. bossInstance.Employees().each(function(record){
    49. console.log(record.get('Id'));
    50. console.log(record.get('Name'));
    51. });

    实例:用户和城市(一对多)

    1. //定义用户模型
    2. Ext.define('PandaApp.model.User', {
    3. extend: 'Ext.data.Model',
    4. fields: [
    5. { name: 'id', type: 'int' },
    6. { name: 'Name', type: 'string' }
    7. ]
    8. ,
    9. proxy: {
    10. url: '/user.json',
    11. type: 'ajax',
    12. reader: {
    13. type: 'json'
    14. }
    15. },
    16. hasMany: [ //定义外键的模型
    17. {
    18. name: 'Cities',
    19. model: 'PandaApp.model.City'
    20. }
    21. ]
    22. });
    23. //定义城市模型
    24. Ext.define('PandaApp.model.City', {
    25. extend: 'Ext.data.Model',
    26. fields: [
    27. { name: 'Id', type: 'int' },
    28. { name: 'CityName', type: 'string' }
    29. ],
    30. idPropery: 'Id',
    31. proxy: {
    32. url: '/city.json',
    33. type: 'ajax',
    34. reader: {
    35. type: 'json'
    36. }
    37. }
    38. });
    39. //模型实例化
    40. var userInstance = Ext.create('PandaApp.model.User');
    41. //加载数据
    42. PandaApp.model.User.load(666,{
    43. scope: this,
    44. success: function(record, operation) {
    45. console.log('success');
    46. PandaApp.model.City.load(record.get('AddressId'),{
    47. scope: this,
    48. success: function(record, operation) {
    49. console.log(record);
    50. },
    51. failure: function(record, operation) {
    52. console.log('failure');
    53. },
    54. callback: function(record, operation, success) {
    55. console.log('callback');
    56. }
    57. });
    58. },
    59. failure: function(record, operation) {
    60. console.log(record);
    61. },
    62. callback: function(record, operation, success) {
    63. console.log('callback');
    64. }
    65. });

    多对对关联(Many-to-Many)

    说明

    使用Model下的manyToMany配置项即可
    注意:在两个Model中都需要添加manyToMany配置项
    单个形式:

    manyToMany: 'PandaApp.model.ModelName'

    多个形式:

    1. manyToMany: [
    2. 'PandaApp.model.ModelName'
    3. ],

    实例:用户和订单

    1. //定义User模型
    2. Ext.define('PandaApp.model.User', {
    3. extend: 'Ext.data.Model',
    4. idPropery: 'id',
    5. fields: [
    6. { name: 'id', type: 'int' },
    7. { name: 'name', type: 'string' }
    8. ],
    9. manyToMany: [ //定义多对多
    10. 'Order'
    11. ],
    12. proxy: {
    13. url: '/user.json',
    14. type: 'ajax',
    15. model: 'PandaApp.model.User',
    16. reader: {
    17. type: 'json'
    18. }
    19. }
    20. });
    21. //定义Order模型
    22. Ext.define('PandaApp.model.Order', {
    23. extend: 'Ext.data.Model',
    24. idPropery: 'id',
    25. fields: [
    26. { name: 'id', type: 'int' },
    27. { name: 'orderTitle', type: 'string' }
    28. ],
    29. manyToMany: [ //定义多对多
    30. 'User'
    31. ],
    32. proxy: {
    33. url: '/order.json',
    34. type: 'ajax',
    35. reader: {
    36. type: 'json'
    37. }
    38. }
    39. });
    40. //使用静态方法加载数据
    41. PandaApp.model.User.load(666, {
    42. success: function(record){
    43. console.log('success');
    44. console.log(record.get('id')); //666
    45. console.log(record.get('name')); //panda
    46. //加载对应的order
    47. record.orders().load(function(){
    48. console.log(record.orders().count());
    49. });
    50. },
    51. failure: function(record, operation) {
    52. console.log('failure');
    53. },
    54. callback: function(record, operation, success) {
    55. console.log('callback');
    56. }
    57. });

    实例:学生和课程

    1. // 定义学生Model
    2. Ext.define('Student', {
    3. extend: 'Ext.data.Model',
    4. idProperty:'Id',
    5. fields: [
    6. { name: 'Id', type: 'int' },
    7. 'firstName',
    8. 'lastName'
    9. ],
    10. identifier: {
    11. type: 'negative'
    12. },
    13. manyToMany: 'Course' //关联到课程Model
    14. });
    15. //定义课程Model
    16. Ext.define('Course', {
    17. extend: 'Ext.data.Model',
    18. idProperty: 'Id',
    19. fields: [
    20. { name: 'Id', type: 'int' },
    21. 'courseName'
    22. ],
    23. identifier: {
    24. type: 'negative'
    25. },
    26. manyToMany: 'Course' //关联到课程Model
    27. });

    实例

    实例:定义一对一关联

    1. //用户与消息的关联,一个用户对应多个消息
    2. //定义用户Model
    3. Ext.define('MyApp.model.User', {
    4. extend: 'MyApp.model.Base',
    5. fields: [{
    6. name: 'name',
    7. type: 'string'
    8. }]
    9. });
    10. //定义消息Model
    11. Ext.define('MyApp.model.Message', {
    12. extend: 'MyApp.model.Base',
    13. fields: [{
    14. name: 'userId',
    15. //定义关联到User
    16. reference: 'User',
    17. type: 'int'
    18. }, {
    19. name: 'title',
    20. type: 'string'
    21. }]
    22. });

    实例:一对一,定义模型的关联,并设置实例之间的关联

    1. //人和地址之间,一个人对应一个地址
    2. //定义地址Model
    3. Ext.define('AddressModel',{
    4. extend: 'Ext.data.Model',
    5. fields: [
    6. { name: 'addressId', type: 'int'},
    7. { name: 'addressDescription', type: 'string'}
    8. ]
    9. });
    10. //定义人Model
    11. Ext.define('PersonModel',{
    12. extend: 'Ext.data.Model',
    13. fields: [
    14. { name: 'id', type: 'int' },
    15. { name:'name', type: 'string'},
    16. { name: 'addressId', reference: 'AddressModel'}
    17. ]
    18. });
    19. //定义人Model实例
    20. var personData = Ext.create('PersonModel',{
    21. id: 666,
    22. name: 'Panda'
    23. });
    24. //定义地址Model实例
    25. var addressData = Ext.create('AddressModel',{
    26. addressId: 888,
    27. addressDescription: "Panda Work Location"
    28. });
    29. //建立关联
    30. personData.address = addressData;
    31. if(personData.isValid())
    32. {
    33. var id = personData.get('id');
    34. var name = personData.get('name');
    35. var address = personData.get('addressId');
    36. console.log(id);
    37. console.log(name);
    38. console.log(address);
    39. }
    40. else
    41. {
    42. console.log('data is not valid');
    43. }

    实例:定义一对多关联

    1. //定义部门Model
    2. Ext.define('DepartmentModel', {
    3. extend: 'Ext.data.Model',
    4. fields: [
    5. { name: 'departmentId', type: 'int'},
    6. { name: 'departmentTitle', type: 'string'}
    7. ]
    8. });
    9. //定义公司Model
    10. Ext.define('CompanyModel', {
    11. extend: 'Ext.data.Model',
    12. fields: [
    13. { name: 'companyId', type: 'int' },
    14. { name: 'companyTitle', type: 'string' }
    15. ],
    16. hasMany:{
    17. name: 'department',
    18. model: 'DepartmentModel'
    19. }
    20. });

    实例:定义多对多关联

    1. //定义员工Model
    2. Ext.define('Employee', {
    3. extend: 'Ext.data.Model',
    4. fields: [
    5. { name: 'empId', type: 'int', convert: null },
    6. { name: 'firstName', type: 'string'},
    7. { name: 'lastName', type: 'string'},
    8. ],
    9. //定义多对多
    10. manyToMany: 'Project'
    11. });
    12. //定义项目Model
    13. Ext.define('Project', {
    14. extend: 'Ext.data.Model',
    15. fields: [
    16. 'name'
    17. ],
    18. //定义多对多
    19. manyToMany: 'Employee'
    20. });

    实例:定义多对多并实例化关联

    1. // 定义学生Model
    2. Ext.define('Student', {
    3. extend: 'Ext.data.Model',
    4. idProperty:'Id',
    5. fields: [
    6. { name: 'Id', type: 'int' },
    7. 'firstName',
    8. 'lastName'
    9. ],
    10. identifier: {
    11. type: 'negative'
    12. },
    13. manyToMany: 'Course' //关联到课程Model
    14. });
    15. //定义课程Model
    16. Ext.define('Course', {
    17. extend: 'Ext.data.Model',
    18. idProperty: 'Id',
    19. fields: [
    20. { name: 'Id', type: 'int' },
    21. 'courseName'
    22. ],
    23. identifier: {
    24. type: 'negative'
    25. }
    26. });
    27. //定义课程Model实例1
    28. var course1 = Ext.create('Course', {
    29. courseName: 'Course1'
    30. });
    31. //定义课程Model实例2
    32. var course2 = Ext.create('Course', {
    33. courseName: 'Course2'
    34. });
    35. //定义课程Model实例3
    36. var course3 = Ext.create('Course', {
    37. courseName: 'Course3'
    38. });
    39. //定义课程Model实例4
    40. var course4 = Ext.create('Course', {
    41. courseName: 'Course4'
    42. });
    43. var course5 = Ext.create('Course', {
    44. courseName: 'Course5'
    45. });
    46. //定义学生Model实例1
    47. var studentRecord = Ext.create('Student',{
    48. firstName:'steve',
    49. lastName: 'Jobs'
    50. });
    51. //定义学生Model实例2
    52. var student1 = Ext.create('Student', {
    53. firstName: 'Bob',
    54. lastName: 'Friss'
    55. });
    56. //定义学生Model实例3
    57. var student2 = Ext.create('Student', {
    58. firstName: 'James',
    59. lastName: 'Bond'
    60. });
    61. //定义学生Model实例4
    62. var student3 = Ext.create('Student', {
    63. firstName: 'Sachin',
    64. lastName: 'Tendulkar'
    65. });
    66. //学生添加课程
    67. student1.courses().add(course1);
    68. student1.courses().add(course2);
    69. //课程添加学生
    70. course3.students().add(student2);
    71. course3.students().add(student3);

    实例:使用关联Model

    1. MyApp.model.User.load(1, {
    2. callback: function(user) {
    3. console.log('User: ' + user.get('name'));
    4. user.posts(function(posts){
    5. posts.each(function(post) {
    6. console.log('Post: ' + post.get('title'));
    7. });
    8. });
    9. }
    10. });
  • 相关阅读:
    简述扫码登录原理及测试要点
    python录制屏幕小工具,已调试成功运行
    【owt】vs2022 + v141 : 查看WINDOWSSDKDIR
    ADSP-21489的开发详解:Norflash的编程和烧写
    数据类型和 Java 基础⾯试问题
    JShaman JS代码混淆加密效果
    Redis的常用数据结构之字符串类型
    机器学习(第二章)—— 模型评估
    Ubuntu16.04搭建UbertoothOne环境
    Flink CDC 2.0 主要是借鉴 DBLog 算法
  • 原文地址:https://blog.csdn.net/weixin_38304160/article/details/125904844