Phoenix Elixir – Using Preload to Call Relation Data

Phoenix Elixir – Using Preload to call Relation Data

Phoenix Framework menyediakan sebuah fitur untuk memudahkan developer menampilkan field-field pada tabel yang berelasi dengan suatu tabel tanpa harus melakukan query yang berulang. Sebagai contoh terdapat tabel “mothers” dan tabel “children” dimana setiap data pada tabel “children” akan memiliki field “mother_id” yang merupakan foreign_key dari tabel “mothers”. Berikut adalah class model mothers :

defmodule App.Mother do
  use App.Web, :model

  schema "mother" do
    field :name, :string
  end
end

Dan berikut class dari tabel “Children” :

defmodule App.Children do
  use App.Web, :model

  schema "children" do
    field :label, :string
    field :mother_id, :integer
  end
end

Saya asumsikan kita ingin menampilkan semua data dari tabel “Children”, berikut query yang kita gunakan :

 query = from u in Children,
                select: u

 datas = Repo.all(query)

Variabel “datas” akan menyimpan semau data dari tabel “children” dengan field “label” dan “mother_id”. Pengguna tidak akan tahu apa arti dari “mother_id” karena data yang ditampilkan berupa “id” bukan nama. Untuk mengatasi masalah ini, phoenix menyediakan fitur untuk memanggil field “name” dari tabel mother. Berikut langkah-langkahnya :

Pada class “Children” lakukan modifikasi pada schema sebagai berikut:

  schema "children" do
    field :label, :string
    belongs_to :mother, App.Mother
  end

Code di atas akan mendefinisikan relation pada tabel children yang mengarah pada tabel mother. Relation bernama “:mother” akan membuat Phoenix secara otomatis membaca field yang be-relasi (foreign key) adalah field “mother_id” (field dengan tambahan “_id” dari nama relasi). Untuk itu pastikan nama field anda sesuai dengan nama relation ditambah “_id”.

Berikut cara memanggil seluruh data children beserta data dari tabel relasinya :

    query = from u in Children,
                select: u

    datas = Repo.all(query)
          |> Repo.preload(:mother)

Bagaimana jika kita memiliki sebuah database yang telah memasuki tahap production sehingga tidak memungkinkan mengikuti nama field sesuai kaedah dari Phoenix? Jangan khawatir, Phoenix telah menyediakan sebuah mekanisme yang memungkinkan anda bebas melakukan pengaturan dengan relation anda. Sebagai contoh tabel “Children” memiliki field relation dengan nama “id_mother”, maka buatlah schema anda seperti berikut :

  schema "children" do
    field :label, :string
    field :id_mother, :integer
    belongs_to :mother, App.Mother, define_field: false, foreign_key: :id_mother
  end

Anda juga dapat mendefinisikan lebih dari satu field relasi pada suatu schema. Sebagai contoh:

  schema "children" do
    field :label, :string
    field :id_mother, :integer
    belongs_to :mother, App.Mother, define_field: false, foreign_key: :id_mother
    belongs_to :another_relation, App.AnotherRelation
  end

Kedua relasi tersebut dapat dipanggil dengan cara berikut :

   query = from u in Children,
                select: u

    datas = Repo.all(query)
          |> Repo.preload([:mother, :another_relation])

Itulah semua yang perlu anda lakukan untuk mengatur relasi tabel anda… Selesai, selamat mencoba..

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: