如何在多对多关系中使用 MikroORM 中的“智能查询条件”#6250

问题描述 投票:0回答:1

背景

我有两个实体:

@Entity({ tableName: 'students' })
export class StudentEntity {
  @Property()
  firstName: string;

  @Property()
  lastName: string;

  @ManyToMany({
  entity: () => TeacherEntity,
    pivotTable: 'students_to_teachers',
    joinColumn: 'student_id',
    inverseJoinColumn: ;teacher_id'
  })
  teachers = new Collection<TeacherEntity>(this);
}

还有...

@Entity({ tableName: 'teachers' })
export class TeacherEntity {
   @OneToOne(() => UserEntity, {
    owner: true,
    fieldName: 'user_id',
  })
  user: UserEntity;

  @ManyToMany({
    entity: () => StudentEntity,
    pivotTable: 'students_to_teachers',
    joinColumn: 'teacher_id',
    mappedBy: (s: StudentEntity) => s.teachers
  })
  students = new Collection<StudentEntity>(this);
}

任务

给定一个

userId
一个
UserEntity
的一个
TeacherEntity
,我可以通过

带领所有与这位老师有联系的学生
const students = await this.studentsRepo.find(
  {
    teachers: {
      user: {
        id: userId
      }
    }
  }
);

问题

现在我想要相反的。我想带所有与这位老师没有联系的学生。本能地,我做了类似的事情

const students = await this.studentsRepo.find(
  {
    teachers: {
      user: {
        $ne: {
          id: userId
        }
      }
    }
  }
);

但是没有成功。

请多多指教!

postgresql orm mikro-orm
1个回答
0
投票

您可以为此使用集合运算符:

const students = await this.studentsRepo.find({
  teachers: {
    $none: {
      user: userId // no need to query by `user.id` explicitly
    }
  }
});

https://mikro-orm.io/docs/query-conditions#collection

您尝试的也是错误的,

$ne
代表运算符,您需要在最低级别上应用它,所以
user: { id: { $ne: 123 } }
而不是
user: { $ne: { id: 123 } }
(但同样,这里根本不需要显式的
id
查询)。但这可能不会达到您想要的效果,您很可能需要子查询(这就是集合运算符正在做的事情)。


下次你不必在 2 分钟内在 GH 和 SO 上问同样的事情,我都订阅了。

© www.soinside.com 2019 - 2024. All rights reserved.