取出关系对象的数据

在一个查询中加载 photo 及 photo metadata 有两种方法。使用find *或使用QueryBuilder。我们先使用find *方法。 find *方法允许你使用FindOneOptions / FindManyOptions接口指定对象。

  1. import { createConnection } from "typeorm";
  2. import { Photo } from "./entity/Photo";
  3. import { PhotoMetadata } from "./entity/PhotoMetadata";
  4. createConnection(/*...*/)
  5. .then(async connection => {
  6. /*...*/
  7. let photoRepository = connection.getRepository(Photo);
  8. let photos = await photoRepository.find({ relations: ["metadata"] });
  9. })
  10. .catch(error => console.log(error));

photos 将包含来自数据库的 photos 数组,每个 photo 将包含其 photo metadata。详细了解本文档中的查找选项

使用查找选项很简单,但是如果你需要更复杂的查询,则应该使用QueryBuilderQueryBuilder允许以更优雅的方式使用更复杂的查询:

  1. import { createConnection } from "typeorm";
  2. import { Photo } from "./entity/Photo";
  3. import { PhotoMetadata } from "./entity/PhotoMetadata";
  4. createConnection(/*...*/)
  5. .then(async connection => {
  6. /*...*/
  7. let photos = await connection
  8. .getRepository(Photo)
  9. .createQueryBuilder("photo")
  10. .innerJoinAndSelect("photo.metadata", "metadata")
  11. .getMany();
  12. })
  13. .catch(error => console.log(error));

QueryBuilder允许创建和执行几乎任何复杂性的 SQL 查询。使用QueryBuilder时,请考虑创建 SQL 查询。在此示例中,”photo”和”metadata”是应用于所选 photos 的 ​​ 别名。你可以使用别名来访问所选数据的列和属性。