随着 Angular、NgRx-Data 和 NestJs 越来越流行,我觉得可能有不少程序员对以下查询语法感到疑惑。
我有一个使用 Angular 8 和 NgRx-Data 组成的客户端(前端)的运行原型。后端是基于 NestJs 的服务器 + MySQL。
除了查询之外,我可以很好地在所有部分之间检索和传递数据。我似乎无法找到有关语法的适当文档。
以下是如何设置客户端的示例:
// Simple entity example (all ngrx-data metadata are declared and set):
export class Hero {
id: number;
name?: string;
age?: number;
}
实体服务/用于获取数据
@Injectable({providedIn: 'root'})
export class HeroService extends EntityCollectionServiceBase<Hero> {
constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory) {
super('Hero', serviceElementsFactory);
}
}
显示数据的组件
@Component({
selector: 'hero-comp',
templateUrl: './hero.component.html',
styleUrls: ['./hero.component.scss']
})
export class HeroComponent {
heroData$: Observable<Hero[]>;
constructor(private heroDatService: HeroService) {
this.heroData$ = this.heroDatService.entities$;
}
private getAllData() {
// This works nicely, I get all records from the db via server
this.heroDatService.getAll();
}
private queryData() {
// This queryParams syntax fails - server complains with this error:
// [HttpExceptionFilter] GET /hero/?age>20
// QueryFailedError: ER_EMPTY_QUERY: Query was empty
// QUESTION: What is the proper syntax?
let queryParams: QueryParams = {
'age > 20'
}
this.fetchDataService.getWithQuery(queryParams);
}
这是与服务器相关的代码摘录:-(有一个服务,但为了简单起见,我将 repo 函数移至控制器函数):
@Controller('hero')
export class HeroController <Hero> {
constructor(readonly repo: Repository<Hero>) {}
// This returns nicely all Hero records from the MySQL db server
@Get()
async getAll(): Promise<Hero[]> {
return await this.repo.find();
}
// This does not work !
// I am not sure about any piece of the code here !
@Get('query')
async query(@Query() sql): Promise<any> {
// Does the sql argument need to be manipulated into parameters: {...} ?
// If yes - how ?
let parameters: undefined;
return await this.repo.query(sql, parameters);
}
请查看每个代码行上方的注释 - 问题已在此处详细说明。
以下是重要的问题:
在客户端,我们如何正确传递其中一些示例的查询条件: - {'age > 20'} - {'age BETWEEN 20 AND 40'} - {'age = 20 OR age = 30 OR age = 40'} - {'name = "Superman"'} - {'name LIKE "Super%"'} - 等等。
此外,传递完整 SQL 语句的语法是什么,例如: - {'SELECT * FROM Heroes WHERE name LIKE "Super%" AND Age > 20;'} 并从服务器获取结果。
为了使这些查询正常工作,两端(客户端和服务器)需要做什么?
非常感谢所有输入。