fix(database): missing reference when rewrite parent field (#1977)
This commit is contained in:
		
							parent
							
								
									9076a1d4e4
								
							
						
					
					
						commit
						d86da18006
					
				@ -16,6 +16,60 @@ pgOnly()('collection inherits', () => {
 | 
			
		||||
    await db.close();
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should not remove parent field reference map after child rewrite field', async () => {
 | 
			
		||||
    const through = db.collection({
 | 
			
		||||
      name: 'through',
 | 
			
		||||
      fields: [{ name: 'name', type: 'string' }],
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    const rootCollection = db.collection({
 | 
			
		||||
      name: 'root',
 | 
			
		||||
      fields: [
 | 
			
		||||
        { name: 'name', type: 'string' },
 | 
			
		||||
        {
 | 
			
		||||
          name: 'targets',
 | 
			
		||||
          type: 'belongsToMany',
 | 
			
		||||
          target: 'root-target',
 | 
			
		||||
          through: 'through',
 | 
			
		||||
          foreignKey: 'rootId',
 | 
			
		||||
          otherKey: 'targetId',
 | 
			
		||||
        },
 | 
			
		||||
      ],
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    const rootTarget = db.collection({
 | 
			
		||||
      name: 'root-target',
 | 
			
		||||
      fields: [{ name: 'name', type: 'string' }],
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    await db.sync({ force: true });
 | 
			
		||||
 | 
			
		||||
    expect(db.referenceMap.getReferences('root-target')).toHaveLength(1);
 | 
			
		||||
 | 
			
		||||
    const child = db.collection({
 | 
			
		||||
      name: 'child',
 | 
			
		||||
      inherits: ['root'],
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    const childTarget = db.collection({
 | 
			
		||||
      name: 'child-target',
 | 
			
		||||
      inherits: ['root-target'],
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    await child.setField('targets', {
 | 
			
		||||
      name: 'targets',
 | 
			
		||||
      type: 'belongsToMany',
 | 
			
		||||
      target: 'child-target',
 | 
			
		||||
      through: 'through',
 | 
			
		||||
      foreignKey: 'rootId',
 | 
			
		||||
      otherKey: 'targetId',
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    await db.sync();
 | 
			
		||||
 | 
			
		||||
    expect(db.referenceMap.getReferences('root-target')).toHaveLength(1);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should list data filtered by child type', async () => {
 | 
			
		||||
    const rootCollection = db.collection({
 | 
			
		||||
      name: 'root',
 | 
			
		||||
 | 
			
		||||
@ -5,12 +5,12 @@ import { checkIdentifier } from '../utils';
 | 
			
		||||
import { BaseRelationFieldOptions, RelationField } from './relation-field';
 | 
			
		||||
 | 
			
		||||
export class BelongsToField extends RelationField {
 | 
			
		||||
  static type = 'belongsTo';
 | 
			
		||||
 | 
			
		||||
  get dataType() {
 | 
			
		||||
    return 'BelongsTo';
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static type = 'belongsTo';
 | 
			
		||||
 | 
			
		||||
  get target() {
 | 
			
		||||
    const { target, name } = this.options;
 | 
			
		||||
    return target || Utils.pluralize(name);
 | 
			
		||||
@ -78,7 +78,9 @@ export class BelongsToField extends RelationField {
 | 
			
		||||
 | 
			
		||||
    this.collection.addIndex([this.options.foreignKey]);
 | 
			
		||||
 | 
			
		||||
    this.database.referenceMap.addReference(this.reference(association));
 | 
			
		||||
    const reference = this.reference(association);
 | 
			
		||||
 | 
			
		||||
    this.database.referenceMap.addReference(reference);
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
@ -103,7 +105,7 @@ export class BelongsToField extends RelationField {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const association = collection.model.associations[this.name];
 | 
			
		||||
    if (association) {
 | 
			
		||||
    if (association && !this.options.inherit) {
 | 
			
		||||
      const reference = this.reference(association);
 | 
			
		||||
      this.database.referenceMap.removeReference(reference);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -135,7 +135,8 @@ export class BelongsToManyField extends RelationField {
 | 
			
		||||
    // 删掉 model 的关联字段
 | 
			
		||||
 | 
			
		||||
    const association = collection.model.associations[this.name];
 | 
			
		||||
    if (association) {
 | 
			
		||||
 | 
			
		||||
    if (association && !this.options.inherit) {
 | 
			
		||||
      this.references(association).forEach((reference) => this.database.referenceMap.removeReference(reference));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -175,7 +175,7 @@ export class HasManyField extends RelationField {
 | 
			
		||||
 | 
			
		||||
    const association = collection.model.associations[this.name];
 | 
			
		||||
 | 
			
		||||
    if (association) {
 | 
			
		||||
    if (association && !this.options.inherit) {
 | 
			
		||||
      this.database.referenceMap.removeReference(this.reference(association));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -181,7 +181,7 @@ export class HasOneField extends RelationField {
 | 
			
		||||
 | 
			
		||||
    const association = collection.model.associations[this.name];
 | 
			
		||||
 | 
			
		||||
    if (association) {
 | 
			
		||||
    if (association && !this.options.inherit) {
 | 
			
		||||
      this.database.referenceMap.removeReference(this.reference(association));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user