我在 Loopback 4 中的何处执行本机 SQL 查询?

Where do I execute native SQL queries in Loopback 4?

我是 Loopback 4 的新手,我一直在尝试执行本机 SQL 查询。我找到了如何去做,问题是没有任何线索可以将它放在我的代码中以使其工作......这是我找到的documentation

我需要知道我应该把它放在哪里:

const result = await repository.execute('SELECT * FROM Products');

在我的 Loopback 项目中,它有很多文件。我的目标是创建一个像 /products/[name] 这样的 REST 端点,其中 [name] 作为动态插入到 SQL 查询的参数。

就我个人而言,我会将其实现为一个新的 Repository 方法。

假设您的模型名为 Product,那么您的项目中应该已经存在 src/repositories/product.repository.ts 文件导出 ProductRepository class。 (您可以 运行 lb4 repository 创建它。)

export class Product extends DefaultCrudRepository<
  Product,
  typeof Product,
  Product Relations
> {
  constructor(@inject('datasources.db') dataSource: DbDataSource) {
    super(Product, dataSource);
  }

  // your custom method
  async selectByName(name: string): Promise<Product[]> {
    const rawItems = await repository.execute('SELECT * FROM Products');
    // would you like to convert raw data into Product instances?
    return rawItems.map(it => new Product(it));
  }
}

然后您可以从您的控制器调用这个新的自定义存储库方法,就像您调用例如repository.find(filter).

您可以根据环回文档 https://loopback.io/doc/en/lb4/Controller.html 在您的控制器 class 中执行此操作。正如您将在控制器本身中定义 REST 端点一样,您也可以使用 repository.execute() 例如

在此处进行插入
  @get('/products/{name}')
  async doSomething(    
    @param.path.string('name') name: string,
  ): Promise<Product> {
  
  const sql = `SELECT * FROM some_table WHERE some_field="${name}"`;
  await this.productRepository.execute(sql)
        
         --- other lines of code & return value --
  }