التحقق من عدم تكرار القيم في قاعدة البيانات (البيانات الفريدة) - الطريقة الجديدة

 الواجهة الخلفية (الخدمة):

// للإضافة
  async allSerialNumbersOrg(): Promise<any> {
    let field = 'serial_number_org';
    let query: any = await this.assetRepository
      .createQueryBuilder('assets')
      .select(`DISTINCT(${field})`)
      .where(`${field} IS NOT NULL`)
      .where(`${field} != ''`)
      .getRawMany();

    return query.map(element => element.serial_number_org);
  }

  // للتعديل
  async allSerialNumbersOrgButThis(value: string): Promise<any> {
    let field = 'serial_number_org';
    let query: any = await this.assetRepository
      .createQueryBuilder('assets')
      .select(`DISTINCT(${field})`)
      .where(`${field} IS NOT NULL`)
      .where(`${field} != ''`)
      .andWhere(`${field} != '${value}'`)
      .getRawMany();

    return query.map(element => element.serial_number_org);
  }


الواجهة الخلفية (المراقب):

// للإضافة
  @Get('all-ids')
  allIds() {
    return this.ingredientsService.allIds();
  }

  // للتعديل
  @Get('all-ids-but-this/:ingredient_id')
  allIdsButThis(@Param('ingredient_id') ingredient_id: string) {
    return this.ingredientsService.allIdsButThis(ingredient_id);
  }

طريقة استخدام أفضل (الخدمة):

  // للإضافة
  async allSerialNumbers(): Promise<any> {
    let field = 'serial_number';
    let query: any = await this.assetRepository
      .createQueryBuilder('assets')
      .select(`DISTINCT(${field})`)
      .where(`${field} IS NOT NULL`)
      .getRawMany();

    return query.map(element => element.serial_number);
  }

  // للتعديل
  async allSerialNumbersButThis(value: string): Promise<any> {
    let field = 'serial_number';
    let query: any = await this.assetRepository
      .createQueryBuilder('assets')
      .select(`DISTINCT(${field})`)
      .where(`${field} IS NOT NULL`)
      .andWhere(`${field} != '${value}'`)
      .getRawMany();

    return query.map(element => element.serial_number);
  }

طريقة استخدام أفضل (المراقب):

  // للإضافة
  @Get('all-serial-numbers')
  allSerialNumbers() {
    return this.assetsService.allSerialNumbers();
  }

  // للتعديل
  @Get('all-serial-numbers-but-this/:value')
  allIdsButThis(@Param('value') value: string) {
    return this.assetsService.allSerialNumbersButThis(value);
  }

الواجهة الأمامية (الخدمة):

  // للإضافة
  public getAllIds(): Observable<any> {
    return this.http.get(`${this.backEndURL}/${this.tableName}/all-ids`);
  }

  // للتعديل
  public getAllIdsButThis(value: string): Observable<any> {
    return this.http.get(`${this.backEndURL}/${this.tableName}/all-ids-but-this/${value}`);
  }

الواجهة الأمامية (المكوّن):

  existingValues: any[] = []; // Example of existing values

  constructor(public translateService: TranslateService,
    public copyToClipboardService: CopyToClipboardService,
    // private storage: AngularFireStorage,
    private _formBuilder: FormBuilder,
    public googleTranslateService: _GoogleTranslateService,
    public convertionHijriDateService: ConvertionHijriDateService,
    private ingredientsService: IngredientsService,
    private ingredientsClassificationsService: IngredientsClassificationsService,
    private uploadService: FirebaseUploadService,
    private snackBarService: SnackBarService,
    @Inject(MAT_DIALOG_DATA) public data: Ingredient,
    public dialog: MatDialog,
    private localStorageService: LocalStorageService,
    private timeCalculator: _FileTimeCalculatorService
  ) {
    this.lang = this.localStorageService.getLanguageCode();
    if (this.data) {
      // حالة التعديل
      this.ingredientsService.getAllIdsButThis(this.data?.ingredient_id).subscribe((res: any[]) => {
        this.existingValues = res;
      });
      this.editMode = false;
    } else {
      // حالة الإنشاء
      this.ingredientsService.getAllIds().subscribe((res: any[]) => {
        this.existingValues = res;
      });
      this.data = new Ingredient();
      this.editMode = true;
    }
    this.bringClassificaton();
  }

  ngOnInit() {
    this.refresh();
    this.form = this._formBuilder.group({
      id: null,
      ingredient_id: ['', [Validators.required, this.uniqueValueValidator()]],
      ar_name: ['', Validators.required],
      en_name: ['', Validators.required],
      classification: (this.data?.id) ? [''] : ['', Validators.required],
      quantity: ['', Validators.required],
      price: ['', Validators.required],
      grams: ['', Validators.required],
      notes: [''],
      image: ['', this.fileValidator(this.extensions, 2)],
    });
  }

  uniqueValueValidator(): ValidatorFn {
    return (control: AbstractControl): ValidationErrors | null => {
      const value = control.value;
      if (this.existingValues.includes(value)) {
        return { uniqueValue: { value: this.translateService.instant('ERRORS.NO_DUPLUCAITE') } };
      }
      return null;
    };
  }


<mat-error align="start" *ngIf="form.controls['ingredient_id'].hasError('uniqueValue')">
{{form.controls['ingredient_id'].errors.uniqueValue.value}}
</mat-error>


استعادة عناصر بناءاً على أرقام المعرفات:

  async fintByIngredient(id: number): Promise<any> {
    let query: any = await this.costRepository
.query(`Select DISTINCT(costId) from ingredients_for_costs WHERE ingredientId = ${id} ORDER BY costId ASC`)
    let ids = query.map(cost => cost.costId);
    return this.costRepository.findByIds(ids);
  }













تعليقات

المشاركات الشائعة من هذه المدونة

ngx-extended-pdf-viewer

how to getting access token for https://fcm.googleapis.com/v1/projects/al-ayahya-co/messages:send for angular and backend nestjs

طريقة تفعيل زر Inline Keyboard في Telegram Bot