あなたが(それは、エンドユーザーが入力したなら)入力に%
をエスケープするString.replace/3
を使用して、クエリ内like
を使用する必要があります:
|> where([p], like(p.title, ^"%#{String.replace(term, "%", "\\%")}%"))
例:
iex(1)> term = "Foo%Bar"
iex(2)> query = MyApp.Post |> where([p], like(p.title, ^"%#{String.replace(term, "%", "\\%")}%")) |> order_by(desc: :inserted_at)
#Ecto.Query<from p in MyApp.Post, where: like(p.title, ^"%Foo\\%Bar%"),
order_by: [desc: p.inserted_at]>
iex(3)> Ecto.Adapters.SQL.to_sql(:all, MyApp.Repo, query)
{"SELECT p0.\"id\", p0.\"title\", p0.\"user_id\", p0.\"inserted_at\", p0.\"updated_at\" FROM \"posts\" AS p0 WHERE (p0.\"title\" LIKE $1) ORDER BY p0.\"inserted_at\" DESC",
["%Foo\\%Bar%"]}
あなたは、のような用語を交換をしない場合%
をエスケープする必要があるか、0以上の任意の文字列に一致するため、は"azb"
と一致します。
ドッグベット・ユー・ロック。私はStackOverflowでユーザーに従うことができたらいいと思う。エリクサーグッズのお宝をお届けします。 :いいぞ: –