我有以下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
你知道我怎么解决它吗?
答案 0 :(得分:1)
如果您使用的是has_many
和belongs_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