Typeorm 查找相关实体的条件

len*_*myr 5 orm typescript typeorm

我有两个实体,aUser和一个Post实体。一个用户可以有多个帖子。

我想根据帖子标题和作者姓名查找帖子,如下所示:

const post = await postsRepository.find({
  where: {
    title: postTitle,
    user: {
      name: userName,
    },
  },
  relations: ['user'],
});
Run Code Online (Sandbox Code Playgroud)

Typeorm生成以下 SQL:

SELECT `Post`.`id` AS `Post_id`, `Post`.`title` AS `Post_title`, `Post`.`user_id`
AS `Post_user_id`, `Post__user`.`id` AS `Post__user_id`, `Post__user`.`name` AS
`Post__user_name` FROM `posts` `Post` LEFT JOIN `users` `Post__user` ON
`Post__user`.`id`=`Post`.`user_id` WHERE (`Post`.`user_id` = ?) -- PARAMETERS: [null]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它根本没有查询 name 属性。

但它不起作用,我在文档中找不到任何内容。

[编辑]:另一方面,以下代码按预期工作,但未使用联接来查询关系:

const user = await usersRepository.findOne({ name: userName });
const post = await postsRepository.find({
  where: {
    title: postTitle,
    user: {
      id: user.id,
    },
  },
  relations: ['user'],
});
Run Code Online (Sandbox Code Playgroud)

[/编辑]

我唯一能做的就是这样

const post = await postsRepository.createQueryBuilder('posts')
  .innerJoinAndSelect('posts.user', 'user')
  .where({
    title: postTitle,
  })
  .andWhere('user.name = :name', { name: userName })
  .getOne();
Run Code Online (Sandbox Code Playgroud)

所以这可行,但是说实话,它看起来超级糟糕,并且当您需要按其他关系进行过滤时,写起来非常烦人。

文档中是否有我遗漏的内容?