1

我想预加载一个模型,即使它有一个空外键。我将使用 Adonis 文档页面中的模型来说明:用户和个人资料。

const user = await User.query().preload("profile")

就那么简单!

但在我的情况下,如果用户的 key profile_id 为 null,它会抛出一个异常,这意味着它只预加载现有的关系(很公平)。

明确地说,我不想只预加载具有现有外键的用户,我需要现有的用户相关模型没有模型的用户来预加载。

我已经阅读并测试了文档页面中的示例,但对这个案例没有足够的解释(或者我只是没有找到它)。

任何提示将不胜感激

4

1 回答 1

0

让我先回答您的问题,的,您可以预加载NULLFk

PS-除了查询之外,您没有提供任何详细信息,因此我将做出一些假设。

解释-

  1. 首先,您必须在使用预加载之前定义关系
  2. Relationsgip 应该在包含FK的表中定义,在我们的例子中,它的User表。例如
//User.ts or User.js
import Profile from '/path/to/profile';

...
  @column()
  public profileId: number;

  @belongsTo(() => Profile)
  public profile: BelongsTo<typeof Profile>;
...

如您所见,我在用户表中创建了一个关系。IE

  @belongsTo(() => Profile)
  public profile: BelongsTo<typeof Profile>;

完成此操作后,您可以查询用户和预加载配置文件。

const user = await User.query().preload("profile")

现在,如果用户有个人资料,那么它将被预加载(加入),输出将是这样的

User {
 id: <random-number>,
 profileId: <random-number>,
 profile: {
  ...
 },
 ...
}

如果 profileId 为空,那么输出将是这样的

User {
 id: <random-number>,
 profileId: null,
 ...
}

ps -user变量是用户实例的数组,我给出了只有 1 个用户实例的示例。

我希望这个解释对你有所帮助。

于 2021-05-12T15:51:09.390 回答