Phoenix Elixir – About Ecto

Phoenix Elixir – About Ecto

Ecto adalah sebuah source yang digunakan agar aplikasi dapat terhubung ke database pada bahasa pemrograman Elixir, dan Phoenix Framework juga menggunakan Ecto untuk komunikasi antara database dan aplikasi. Jika anda mengikuti panduan create aplikasi Phoenix baru pada tautan berikut http://www.phoenixframework.org/docs/up-and-running, maka Ecto secara otomatis terinstall pada aplikasi anda.

Secara default Ecto pada Phoenix akan menggunakan database postgreSQL, jika ingin menggunakan database lain harus dilakukan beberapa konfigurasi terlebih dahulu. Pendefenisian Ecto pada aplikasi terdapat pada file “web/mix.exs” pada code :

 def application do
    [mod: {FirstApp, []},
     applications: [:phoenix, :phoenix_pubsub, :phoenix_html, :cowboy, :logger, :gettext,
                    :phoenix_ecto, :postgrex]]
 end

 defp deps do
    [{:phoenix, "~> 1.2.1"},
     {:phoenix_pubsub, "~> 1.0"},
     {:phoenix_ecto, "~> 3.0"},
     {:postgrex, ">= 0.0.0"},
     {:phoenix_html, "~> 2.6"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:gettext, "~> 0.11"},
     {:cowboy, "~> 1.0"}]
  end

Pada konfigurasi di atas dapat dilihat telah didefinisikan phoenix_ecto dan postgrex sebagai database. Sedangkan untuk menghubungkan aplikasi dengan suatu database postgreSQL lakukan konfigurasi pada file “config/dev.exs” tepatnya pada code berikut :

# Configure your database
config :first_app, FirstApp.Repo,
  adapter: Ecto.Adapters.Postgres,
  username: "postgres",
  password: "postgres",
  database: "first_app_dev",
  hostname: "localhost",
  pool_size: 10

Code diatas mendefinisikan identitas database yang akan digunakan mulai dari username dan password, nama database dan attribute lainnya.

MIGRATION

Ecto memungkinkan anda membuat tabel/schema melalui fitur Migration (Ecto.Migration). Sebagai contoh kita akan membuat sebuah tabel “users” pada database. Lakukan pendefinisian file migration pada “priv/repo/migrations” misalnya file “create_user.exs”. Masukkan code berikut :

defmodule FirstApp.Repo.Migrations.CreateUser do
  use Ecto.Migration
  def change do
    create table(:users) do
      add :name, :string
      add :email, :string
      add :birth, :date
      add :age, :integer
      timestamps()
    end
  end
end

File Ecto.Migration di atas akan membuat table users dengan field name, email, birth dan age dengan tipe data yang telah tertera pada masing-masing field. Tabel users juga akan menambahkan field inserted_at dan updated_at yang sudah dimasukkan melalui fungsi “timestamps()”. Untuk menjalankan perintah membuat schema database pada file migration, jalankan perintah berikut pada terminal.

$ mix ecto.migrate

Setelah menjalankan perintah tersebut tabel users akan terbentuk pada database anda dengan tambahan “id” sebagai primary key (id ditambah otomatis oleh Ecto).

MODEL

Komponen MODEL pada MVC Phoenix juga menggunakan Ecto. Model sendiri adalah representasi data pada database termasuk kumpulan field, tipe data, validasi, dll. Berikut adalah contoh class model yang didapat dari tabel User :

defmodule FirstApp.User do
  use FirstApp.Web, :model

  schema "users" do
    field :name, :string
    field :email, :string
    field :birth, Ecto.Date
    field :age, :integer
    timestamps()
  end

  @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:name, :email, :birth, :age])
    |> validate_required([:name, :email, :birth, :age])
    |> validate_length(:name, min: 3)
    |> validate_length(:email, min: 5)
    |> validate_format(:email, ~r/@/, message: "Please fix your email format")
  end
end

Pada contoh di atas kita dapat melihat schema user yang terdiri dari beberapa field beserta jenis data masing-masing field. Model juga memiliki changeset yang digunakan untuk meletakkan validasi, mengatur pesan error, mendefinisikan model pada form, mendefinisikan data untuk proses update/insert, dll.

MENAMPILKAN DATA

Ecto menggunakan “Repo” untuk komunikasi data antara aplikasi dan database. Anda dapat menggunakan Ecto query atau Ecto model untuk mengambil data pada database yang kemudian dapat digunakan pada aplikasi. Untuk menampilkan seluruh data pada tabel “users” ggunakan Repo dan Model dengan code seperti berikut :

    Repo.all(User) 

User merupakan class model User.

Menampilkan suatu data berdasarkan id/primary key tertentu gunakan code berikut :

    Repo.get(User, id)

atau gunakan code berikut untuk menjalankan peirntah yang sama tetapi menampilkan pesan error saat data tidak ditemukan :

    Repo.get!(User, id)

Untuk menampilkan data yang memiliki nilai attribute tertentu :

 Repo.get_by(User, name: “John")

atau gunakan code berikut untuk menjalankan peirntah yang sama tetapi menampilkan pesan error saat data tidak ditemukan :

 Repo.get_by!(User, name: “John”)

Selain memadukan Repo dan Model, kita dapat memadukan Repo dan Query guna mendapatkan data dengan query yang lebih kompleks. Berikut contoh codenya :

 query = from u in User,
                where: u.age == 26,
                select: u

 users = Repo.all(query)

Code di atas akan menampilkan data yang memiliki field age = 26.

MODIFIKASI DATA

Ecto Repo juga menyediakan fitur untuk melakukan proses modifikasi data (update, insert, delete). Proses insert data dapat dilakukan dengan code berikut :

      case Repo.insert %User{name: “Jhon”,age: “26”,birth: “1989-01-01”,email: “jhon@email.com”} do
        {:ok, struct}       -> # Insert something for success process
        {:error, changeset} -> # Insert something for wrong process
      end

Anda dapat melakukan insert data dengan mengambil langsung variabel dari changeset pada model :

    changeset = User.changeset(%User{}, user_params)

    case Repo.insert(changeset) do
      {:ok, _user} ->
        conn
        |> put_flash(:info, "User created successfully.")
        |> redirect(to: user_path(conn, :index))
      {:error, changeset} ->
        render(conn, "new.html", changeset: changeset)
    end

Untuk proses update data gunakan Repo.update :

    user = Repo.get!(User, id)
    changeset = User.changeset(user, user_params)

    case Repo.update(changeset) do
      {:ok, user} ->
        conn
        |> put_flash(:info, "User updated successfully.")
        |> redirect(to: user_path(conn, :show, user))
      {:error, changeset} ->
        render(conn, "edit.html", user: user, changeset: changeset)
    end

Dan untuk delete gunakan Repo.delete :

    user = Repo.get!(User, id)
    Repo.delete!(user)

Selesai, itulah sedikit pembahasan tentang Ecto.. Happy coding..

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: