微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ecto:where 子句是什么理解语法

如何解决Ecto:where 子句是什么理解语法

我正在阅读一本凤凰城 Liveview 的书,发现了这条线:

|> where([d],d.user_id == ^user.id)

我正在尝试理解这种语法。我尝试查找 Elixir Guards 但这不是其中之一。这里的 [d] 是什么?这是某种匿名函数吗?

这是在其中使用的函数

  def for_user(query \\ base(),user) do
    query
    |> where([d],d.user_id == ^user.id)
  end

解决方法

where 是由 ecto 定义的宏。这就是为什么要使用它你需要 import Ecto.Query,尽管在很多情况下你看不到它,因为你有一个 use MyApp.Schema 或类似的东西,它已经包含了导入。您可以在此处查看文档:{​​{3}}。

[d] 是宏如何处理给要在 where 子句中使用的记录命名的方式。您可以将名称更改为任何内容,同时更改条件:

query
|> where([a_particular_record],a_particular_record.user_id == ^user.id)

请注意,该宏还覆盖了 ^ 的含义 - 在宏内部,它表示“从宏外部注入此值”,这就是您需要在 user.id 之前使用它的原因。>

,

where 是一个宏,它接受一个查询作为第一个参数并返回一个查询,以便它可以在管道中使用。管道化许多 where 会导致它们与 AND 结合。如果要将 where 子句与 OR 结合使用,可以使用 or_where 宏。

所以,下面的代码:

query
|> where([user],user.id == ^user.id)
|> where([user],user.name == ^user.name)

将生成一个看起来像这样的 SQL 查询:

WHERE user.id = 1 AND user.name = 'somename'

第二个参数是所谓的 bindings 的列表。在上面的示例中,user 是一个绑定。绑定的工作方式很像 SQL 中的表别名,并有效地为您提供一个变量,用于在整个查询中引用您的表(此描述取自伟大的 Programming Ecto,它深入了解了 Ecto 的工作原理和使用方法) .如果查询包含连接,则绑定列表可以包含多个元素。使用连接时,绑定应该按照它们指定的顺序进行匹配。

from(user in User)
|> join(:inner,[user],user_settings in assoc(u,:user_settings))
|> where([_user,us],where: us.role == "admin")

绑定变量名称可以不同,但​​它们指向同一件事。在上面的示例中,join 中的用户设置绑定到 user_settings 变量,但在 where 子句中,它们绑定到 us 变量。

命名绑定也是可能的,它们可以解决一些非命名绑定无法解决的问题,但这里不对其进行描述。在 Ecto Documentation 中可以找到更多关于他们的信息。

where 宏中的最后一个参数是一个必须计算为布尔值的表达式。此表达式包含您要编写的实际 where 子句。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。