在Ecto模型中使用外键查询

时间:2016-01-11 08:18:35

标签: elixir ecto

我有以下Ecto架构:

schema "videos" do
    field :name, :string
    field :mpdName, :string
    field :urlPlayready, :string, size: 500
    field :urlWidevine, :string, size: 500
    field :urlFile, :string, size: 500
    field :custom_data, :string, size: 500
    field :drm_today, :boolean
    field :vote, :integer
    has_many :user_videos, VideoBackend.UserVideos
    has_many :users, through: [:user_videos, :user]
    timestamps
  end


schema "users"  do
   field :name, :string
   field :email, :string ,  [:primary_key]
   field :encrypted_password, :string
   field :password, :string, virtual: true
   has_many :user_videos, VideoBackend.UserVideos
   has_many :videos, through: [:user_videos, :video]
   timestamps   
end

schema "user_videos" do
  belongs_to :users, VideoBackend.User
  belongs_to :videos, VideoBackend.Video
  field :time, :float
  field :device, :integer
  timestamps
end

现在我想创建一个查询,根据特定的用户选择user_videos"和特定的"视频"。在SQL中我会写这个简单的查询:

  

SELECT FROM user_videos WHERE user =" user"和视频="视频"

我尝试编写以下Ecto查询,但它不起作用:

def single_userVideo(user,video) do
    from u in UserVideos,
    where: u.user == ^user and u.video == ^video
end

你知道我怎么解决它吗?

1 个答案:

答案 0 :(得分:1)

如果您使用的是has_manybelongs_to,那么您可能希望根据_id列进行查询。

所以SQL将是:

  

SELECT FROM user_videos WHERE user_id =" user"和video_id ="视频"

查询:

def single_user_video(%{id: user_id}, %{id: video_id}) do
  from u in UserVideos,
  where: u.user_id == ^user_id,
  where: u.video_id == ^video_id
end

在查询中多次使用where/3时,它会在查询中使用AND

  

其中表达式用于过滤结果集。如果表达式中有多个表达式,则将它们与运算符组合使用。所有表达式必须求值为布尔值。

另外,Elxir中的函数是用snake_case编写的,因此single_userVideos应为single_user_videos