Как я могу сделать соединение двух таблиц в loopback4 - PullRequest
0 голосов
/ 28 декабря 2018

Я создал в своем коде контроллер, модель и хранилище, упомянутые ниже.Пожалуйста, посмотрите.

Я разработал приведенный ниже код, но по-прежнему не могу выполнить операцию объединения.

Я собираюсь объединить две таблицы, которые являются таблицами персонажа и информации.

 - Info table having one foreign key which is belong to person table.

 - Person table: id, name, status

 - Info table : id, person_id , name , status

Я также создал репозиторий, модель и файл контроллера для информации и персоны.

Репозиторий персон (person.repository.ts)

) {
  super(Person, dataSource);
  this.infos = this._createHasOneRepositoryFactoryFor(
    'info',
    getInfoRepository,
 );
}

Модуль персон (person.module.ts)

 @hasOne(() => Info)
    infos?: Info;

 constructor(data?: Partial<Person>) {
  super(data);
 }

Информационный модуль (info.module.ts)

 @belongsTo(() => Person)
 personId: number;

 constructor(data?: Partial<Info>) {
    super(data);
 }

Показывает ошибку вроде этой Необработанная ошибка в GET / people / fetchfromtwotable? filter [offset] = 0 & filter [limit] = 10 & filter [skip] = 0: 500 TypeError: Невозможно прочитать свойство 'target' из неопределенного

Есть ли какие-либо идеи по поводу объединения?

1 Ответ

0 голосов
/ 08 января 2019

drp, спасибо, что поделились своими моделями.Мой пост был удален, потому что я только начинаю и мне нужно запросить дополнительную информацию, которая кажется странной.В любом случае, попробуйте изменить эту строку:

 this.infos = this._createHasOneRepositoryFactoryFor(
'info',
getInfoRepository
);

на

 this.infos = this._createHasOneRepositoryFactoryFor(
'infos',
getInfoRepository,
);

Каркас не может найти отношение «информация» в модели, потому что вы назвали свойство «информация»

Вот мой пример, который в настоящее время работает для меня (работает последняя версия lb4 и postgres):

User.model.ts

import { model, property, hasOne, Entity } from '@loopback/repository';
import { Address } from './address.model';

@model()
export class User extends Entity {

  constructor(data?: Partial<User>) {
    super(data);
  }

  @property({ id: true })
  id: number;
  @property()
  email: string;
  @property()
  isMember: boolean;

  @hasOne(() => Address, {})
  address?: Address;
}

Address.model.ts:

import { model, property, belongsTo, Entity } from '@loopback/repository';
import { User } from '../models/user.model';

@model()
export class Address extends Entity {

  constructor(data?: Partial<Address>) {
    super(data);
  }

  @property({ id: true })
  id: number;

  @property()
  street1: string;
  @property()
  street2: string;
  @property()
  city: string;
  @property()
  state: string;
  @property()
  zip: string;

  @belongsTo(() => User)
  userId: number;

}

User.repository.ts:

import { HasOneRepositoryFactory, DefaultCrudRepository, juggler, repository } from '@loopback/repository';
import { User, Address } from '../models';
import { PostgresDataSource } from '../datasources';
import { inject, Getter } from '@loopback/core';
import { AddressRepository } from '../repositories'

export class UserRepository extends DefaultCrudRepository<
  User,
  typeof User.prototype.id
  > {

  public readonly address: HasOneRepositoryFactory<Address, typeof User.prototype.id>;

  constructor(
    @inject('datasources.postgres')
    dataSource: PostgresDataSource,

    @repository.getter('AddressRepository')
    protected getAccountRepository: Getter<AddressRepository>,

  ) {
    super(User, dataSource);
    this.address = this._createHasOneRepositoryFactoryFor('address', getAccountRepository);

  } // end ctor


}

User.controller.ts (сокращенно по длине):

  @get('/users/{id}/address')
  async getAddress(
    @param.path.number('id') userId: typeof User.prototype.id,
    @param.query.object('filter', getFilterSchemaFor(Address)) filter?: Filter,
  ): Promise<Address> {

    return await this.userRepository
      .address(userId).get(filter);
  }

Надеюсь, это поможет.

Удачи!

...