2017-05-27 2 views
0

Je veux sélectionner un seul enregistrement (l'enregistrement complet) où le nom est xxx et la marque est xxx. L'enregistrement sera toujours singulier parce que le nom et la marque sont un index unique:Ecto 'where et where' clause

def getProductByNameAndBrand(name, brand) do 
    IO.puts("getProductByNameAndBrand") 
    IO.inspect(name) 
    IO.inspect(brand) 
    from p in Api.Product, 
    where: [name: ^name], 
    where: [brand: ^brand] 
    select %{id: p.id, name: p.name, brand: p.brand} 
    end 

Ce jette:

== Compilation error on file lib/api/repo.ex == 
** (CompileError) lib/api/repo.ex:278: undefined function p/0 
    (stdlib) lists.erl:1338: :lists.foreach/2 
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6 

Je préfère ce genre de syntaxe:

def getProductByNameAndBrand(name) do 
    Api.Product |> Ecto.Query.where(name: ^name) |> all 
    end 

Cependant pas sûr si cela peut être fait dans ce style?

Qu'est-ce que je fais mal?

EDIT: À peu près sûr que cela fonctionne de la manière souhaitée, mais affichera ici vérifier encore qu'il n'a pas de bugs:

def getProductByNameAndBrand(name, brand) do 
    Api.Product |> Ecto.Query.where(name: ^name) |> Ecto.Query.where(brand: ^brand) |> all 
    end 

Répondre

3

Dans votre requête écrite dans la syntaxe de requête après la deuxième where, vous avez manqué la virgule. Le reste de votre code semble bien. Dans les versions Ecto les plus récentes, vous avez également or_where si vous souhaitez appliquer des clauses OR au lieu de AND pour les expressions where.