field :email, :string field :name, :string has_many :posts, EctoRelationSample.Contents.Post # this was added timestamps() end @doc false def changeset(user, attrs) do user |> cast(attrs, [:name, :email]) |> validate_required([:name, :email]) end end
field :body, :string field :title, :string belongs_to :user, EctoRelationSample.Account.User # this was added timestamps() end @doc false def changeset(post, attrs) do post |> cast(attrs, [:title, :body]) |> validate_required([:title, :body]) end end
u in User, join: p in Post, where: u.id == p.user_id, group_by: u.name, select: {u.name, count(p.id)} iex(32)> Repo.all(query) [debug] QUERY OK source="users" db=2.1ms SELECT u0."name", count(p1."id") FROM "users" AS u0 INNER JOIN "posts" AS p1 ON TRUE WHERE (u0."id" = p1."user_id") GROUP BY u0."name" [] [{"John Doe", 2}, {"nanashi gonbe", 1}] 2018-08-21 00:13:12.521 PDT [89207] LOG: execute ecto_642: SELECT u0."name", count(p1."id") FROM "users" AS u0 INNER JOIN "posts" AS p1 ON TRUE WHERE (u0."id" = p1."user_id") GROUP BY u0."name" 戻りがタプルのリスト・・・ [{"John Doe", 2}, {"nanashi gonbe", 1}]
users u join posts p on u.id = p.user_id group by u.name" iex(41)> Ecto.Adapters.SQL.query(Repo, sql, []) [debug] QUERY OK db=28.0ms queue=0.1ms select u.name, count(p.id) from users u inner join posts p on u.id = p.user_id group by u.name [] {:ok, %Postgrex.Result{ columns: ["name", "count"], command: :select, connection_id: 90367, num_rows: 2, rows: [["John Doe", 2], ["nanashi gonbe", 1]] }}