Ecto:在 many_to_many 查询中包含连接模式字段

Posted

技术标签:

【中文标题】Ecto:在 many_to_many 查询中包含连接模式字段【英文标题】:Ecto: Include join schema field in many_to_many query 【发布时间】:2016-11-15 15:49:55 【问题描述】:

我有一个 many_to_many 关联,它带有一个显式的 join_schema,它在两端引用相同的模型(有点像经典的 Follower(是用户) Followee(是用户)的东西)。

如果我查询用户的关注者,我想包括关注用户的时间。该数据显然位于连接架构上(我们称之为订阅)。

如果只想要追随者,我会这样做:

followers = User
|> Repo.get!(user_id)
|> assoc(:followers)
|> Repo.all()

要让这个工作,我会在用户身上定义这个:

many_to_many(
  :followers,
  MyApp.User,
  join_through: MyApp.Subscription,
  join_keys: [followee_id: :id, follower_id: :id]
)

假设Subscription 模型上有一个created_at 字段。我该如何查询才能得到它?

【问题讨论】:

【参考方案1】:

由于您已经拥有Subscription 架构,您可以定义has_many

schema "users" do
  ...
  has_many :follower_subscriptions, MyApp.Subscription, foreign_key: :followee_id
  has_many :followee_subscriptions, MyApp.Subscription, foreign_key: :follower_id
end

然后使用以下方式获取订阅:

follower_subscriptions = User
|> Repo.get!(user_id)
|> Repo.preload(follower_subscriptions: :follower)
|> Repo.all()

follower_subscriptions 将成为Subscription 的列表,每个都包含created_atfolloweefollowee_idfollower_id

代码未经测试;如果有错别字,请告诉我。

【讨论】:

嗯,我已经有了这个,但我认为有可能获得一个列表 - 在这种情况下 - 追随者。我想要这样是因为订阅列表破坏了凤凰的render_many。无论如何,我又试了一次,发现它从模式名称中推断出密钥,这显然不匹配,因为它是“FollowerView”。但是有一种方法可以明确定义它。所以问题解决了,谢谢! :)

以上是关于Ecto:在 many_to_many 查询中包含连接模式字段的主要内容,如果未能解决你的问题,请参考以下文章

如何编写这个 many_to_many ActiveRecord 查询?

使用动态运算符创建 Ecto 查询

Ecto - 如何通过特定查询获取“has_many”

在 GraphQL Wordpress 查询搜索中包含 mediaItems

如何在查询中包含零计数结果

Ecto 子查询中的 SQL WITH AS 语句