gpt4 book ai didi

Phoenix同表多对多

转载 作者:行者123 更新时间:2023-12-02 20:37:55 25 4
gpt4 key购买 nike

使用 Ecto v2.2.6、Phoenix 1.3

我有一张人员表(碰巧彼此相关),还有一张这些人的关系表。关系表在一列中列出父级的 id,在另一列中列出子级的 id。

mix phx.gen.json Accounts Person persons name:string age:integer
mix phx.gen.json Accounts Relationship relationships parent_id:references:persons child_id:references:persons

现在,我要在关系架构中添加belongs_to关系(目前看起来像这样)

  schema "relationships" do
field :parent_id, :id
field :child_id, :id
timestamps()
end

但是如果无法显式设置 id,它看起来会像这样(这似乎不起作用)

  schema "relationships" do
belongs_to :person UserRelations.Accounts.Person
belongs_to :person UserRelations.Accounts.Person
timestamps()
end

如何编写关系架构以便捕获这些 belongs_to 关系?

编辑

根据建议,我已经像这样设置了架构:

  schema "relationships" do
belongs_to :parent UserRelations.Accounts.Person
belongs_to :child UserRelations.Accounts.Person
timestamps()
end

我也尝试过对 Person 模式做类似的事情:

  schema "persons" do
field :age, :integer
field :name, :string
many_to_many :parent_of, UserRelations.Accounts.Person, join_through: "relationships"
many_to_many :child_of, UserRelations.Accounts.Person, join_through: "relationships"
timestamps()
end

但是,当我尝试访问这些关系时(我通过苦艾酒/graphql 模式执行此操作),我发现它正在某处寻找 person_id:

[error] Task #PID<0.400.0> started from #PID<0.395.0> terminating
** (Postgrex.Error) ERROR 42703 (undefined_column): column f2.person_id does not exist

最佳答案

  1. 两个belongs_to关系的名称需要不同。例如:

    belongs_to :child, UserRelations.Accounts.Person 
    belongs_to :parent, UserRelations.Accounts.Person

    通过这些名称,Ecto 将正确推断外键:child_idparent_id

  2. 对于 many_to_many,您需要向两者提供 join_keys,因为 Ecto 无法从关系名称和架构模块中推断出它。

    对于第一个,您需要添加:

    , join_keys: [parent_id: :id, child_id: :id]

    第二个:

    , join_keys: [child_id: :id, parent_id: :id]

关于Phoenix同表多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46627249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com