如何使用Elixir和GraphQL从数据库中删除照片

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

我一直在关注EQuimper Instagram克隆的教程。我一直试图通过后端进一步扩展应用程序,因为前端目前并不受关注。我正在尝试实现删除照片功能,但它似乎不起作用,我无法弄清楚为什么。

mutation do
    @doc """
    deletes a photo in the database
    """
    field :photo_delete, list_of(:photo) do
        arg :id, non_null(:id)
        resolve &Resolvers.Posts.photo_delete/3
    end
end

我的schema.ex在突变部分下包含此代码。

def photos(_,_,_) do
    {:ok, Instagram.Posts.list_photos}
end

def photo(_, %{id: id}, _) do
    {:ok, Instagram.Posts.get_photo!(id)}
end

def photo_delete(_, %{id: id}, _) do
    photo_from_db = {:ok, Instagram.Posts.get_photo!(id)}
    {:ok, Instagram.Posts.delete_photo(photo_from_db)}
end

这是resolver.posts文件中的代码,用于返回列表或单个照片。

def delete_photo(%Photo{} = photo) do
Repo.delete(photo)
end

这是执行突变以从数据库中删除照片的代码,该照片接收照片结构并删除它。

object :photo do
    field :id, non_null(:id)
    field :image_url, non_null(:string)
    field :caption, :string

    field :inserted_at, non_null(:string)
    field :update_at, non_null(:string)
end

这是定义照片架构的代码。

schema "photos" do
field :caption, :string
field :image_url, :string

timestamps()

end

@doc false def changeset(%Photo {} = photo,attrs)do photo |> cast(attrs,[:image_url,:caption])|> validate_required([:image_url])end

此代码位于处理架构的photo.ex文件中(我认为)

 mutation {
  photo_delete(id: 1){
    id
 }
}

这是我从数据库中删除查询的突变。它返回错误说

"no function clause matching in Instagram.Posts.delete_photo/1"

从终端返回。我做错了什么?我对这个例子中的函数流程有什么不了解。链接到视频系列:https://www.youtube.com/watch?v=AVQQF_J3Az0&list=PLzQWIQOqeUSOu74jGJMRH06gneM3wL82Z以进一步澄清。

elixir phoenix-framework graphql absinthe
2个回答
0
投票

我认为最可能的罪魁祸首是schema.ex中函数调用正上方的行:

photo_from_db = {:ok, Instagram.Posts.get_photo!(id)}

你可能想要的是这个:

{:ok, photo_from_db} = Instagram.Posts.get_photo!(id)

这样你就可以将函数传递给它所期望的照片结构,而不是{:ok, %Photo{}}


0
投票

找到了答案

field :delete_user, :user do
        arg :id, non_null(:id)
        resolve &Graphical.UserResolver.delete/2
    end

这在你的schema.ex文件中

 def delete(%{id: id}, _info) do
    Accounts.get_user!(id)
    |> Accounts.delete_user
end

然后从模式文件中调用它,该文件将在该id处找到记录,然后将其传递给delete方法,在该方法中它将从数据库中删除

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