Ecto:在 many_to_many 查询中包含连接架构字段
Ecto: Include join schema field in many_to_many query
我有一个 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
字段。我将如何查询以获取它?
由于您已经有了 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_at
、followee
、followee_id
和 follower_id
。
代码未经测试;如果有打字错误,请告诉我。
我有一个 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
字段。我将如何查询以获取它?
由于您已经有了 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_at
、followee
、followee_id
和 follower_id
。
代码未经测试;如果有打字错误,请告诉我。