Yii 2 - Insert multiple table

alfa6661
- January 18, 2016
1 (1 votes)
Rate :
Cara insert multiple table menggunakan Yii 2 Framework

Pada artikel kali ini kita akan membahas bagaimana cara insert ke 2 tabel menggunakan Yii Framework. Pada contoh kali ini kita akan menggunakan 2 tabel sederhana, tabel husband dan tabel wife. Dimana relasi antara kedua tabel ini adalah one to one. Di asumsikan 1 suami hanya memiliki 1 istri.

Tabel

Tabel husband.

Kolom Tipe Data
id Integer Primary Key
name String

Tabel wife

Kolom Tipe Data
husband_id Integer
name String

Migration

Di asumsikan kita telah memiliki aplikasi Yii 2 siap pakai. Langkah pertama, kita buat migration untuk membuat kedua tabel diatas.

Husband

Jalankan perintah untuk migration

./yii migrate/create create_husband
use yii\db\Migration;
class m160118_062032_create_husband extends Migration
{
    private $_table = 'husband';
    public function up()
    {
        $this->createTable($this->_table, [
            'id' => $this->primaryKey(),
            'name' => $this->string()
        ]);
    }
    public function down()
    {
        $this->dropTable($this->_table);
    }
}

Wife

./yii migrate/create create_wife
use yii\db\Migration;
class m160118_062037_create_wife extends Migration
{
    private $_table = 'wife';
    public function up()
    {
        $this->createTable($this->_table, [
            'husband_id' => $this->primaryKey(),            
            'name' => $this->string()
        ]);
        $this->addForeignKey('wife_has_husband', $this->_table, 'husband_id', 'husband', 'id', 'cascade', 'cascade');
    }
    public function down()
    {
        $this->dropTable($this->_table);
    }
}

Model

Generate kedua tabel diatas dengan menggunakan gii. Hasilnya kurang lebih akan seperti ini:

Husband

<?php
namespace app\models;
use Yii;
/**
 * This is the model class for table "husband".
 *
 * @property integer $id
 * @property string $name
 *
 * @property Wife $wife
 */
class Husband extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'husband';
    }
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['name'], 'string', 'max' => 255]
        ];
    }
    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'name' => Yii::t('app', 'Name'),
        ];
    }
    /**
     * @return \yii\db\ActiveQuery
     */
    public function getWife()
    {
        return $this->hasOne(Wife::className(), ['husband_id' => 'id']);
    }
}

Wife

<?php
namespace app\models;
use Yii;
/**
 * This is the model class for table "wife".
 *
 * @property integer $husband_id
 * @property string $name
 *
 * @property Husband $husband
 */
class Wife extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'wife';
    }
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['name'], 'string', 'max' => 255]
        ];
    }
    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'husband_id' => Yii::t('app', 'Husband ID'),
            'name' => Yii::t('app', 'Name'),
        ];
    }
    /**
     * @return \yii\db\ActiveQuery
     */
    public function getHusband()
    {
        return $this->hasOne(Husband::className(), ['id' => 'husband_id']);
    }
}

CRUD

Selanjutnya generate CRUD untuk model Husband, kita akan menggunakan controller ini untuk menyimpan data husband dan wife sekaligus.

Form hasil CRUD kurang lebih akan terlihat seperti ini.

Selanjutnya yang kita perlukan adalah, menambahkan input untuk model wife pada form diatas.

Modifikasi Controller

Untuk menampilkan input wife pada form, kita perlu menambahkan model wife pada actionCreate. Jangan lupa untuk import model Wife dan class Model.

use app\models\Wife;
use yii\base\Model;
public function actionCreate()
{
	$model = new Husband();
	$wife = new Wife();
	if ($model->load(Yii::$app->request->post()) && $wife->load(Yii::$app->request->post()) && Model::validateMultiple([$model, $wife])) {
		$transaction = Yii::$app->db->beginTransaction();
		if($model->save(false) && $model->addWife($wife)) {
			$transaction->commit();
			return $this->redirect(['view', 'id' => $model->id]);
		}
		else {
			$transaction->rollBack();
		}
	}
	return $this->render('create', [
		'model' => $model,
		'wife' => $wife
	]);
}

Pada method save, kita menggunakan parameter false karena kita tidak perlu melakukan validasi lagi ketika model disave. Karena validasi sudah dilakukan sebelumnya dengan method Model::validateMultiple.

Modifikasi Model

Pada kode diatas bisa kita lihat ada method addWife untuk model Husband, method ini kita gunakan untuk menyimpan data wife dan memberikan nilai pada kolom husband_id sesuai dengan data husband yang disimpan.

public function addWife($wife)
{
    $wife->link('husband', $this); // isi nilai husband_id
    return $wife->save(false);
}

Modifikasi View

Untuk menampilkan nama istri pada form, kita perlu mengubah 2 file view antara lain:

create.php

<?= $this->render('_form', [
  'model' => $model,
  'wife' => $wife
]) ?>

_form.php

<?= $form->field($wife, 'name')->textInput(['maxlength' => true]) ?>

Update

Untuk update data, kita perlu mengubah actionUpdate pada Controller dan view update.

Controller

Untuk actionUpdate, pada dasarnya kode yang digunakan hampir sama dengan actionCreate. Hanya saja, jika actionCreate kita harus menginisialisasi object baru, pada actionUpdate kita hanya perlu menggunakan object husband dan wife yang sudah ada (select).

public function actionUpdate($id)
{
  $model = $this->findModel($id);
  $wife = $model->wife;
  if ($model->load(Yii::$app->request->post()) && $wife->load(Yii::$app->request->post()) && Model::validateMultiple([$model, $wife])) {
      $transaction = Yii::$app->db->beginTransaction();
      if($model->save(false) && $model->addWife($wife)) {
          $transaction->commit();
          return $this->redirect(['view', 'id' => $model->id]);
      }
      else {
          $transaction->rollBack();
      }
  }
  return $this->render('update', [
      'model' => $model,
      'wife' => $wife
  ]);
}

View

Untuk view update, kita hanya perlu melakukan hal yang sama dengan view create. yaitu mengirimkan object wife ke view.

<?= $this->render('_form', [
  'model' => $model,
  'wife' => $wife
]) ?>

Tutorial ini hanyalah contoh sederhana untuk menyimpan data kedalam 2 tabel. Silahkan disesuaikan dengan kasus masing-masing :)

Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter

– Eric S. Raymond

Have a better explanation?

If you have comments about this post. Please write your comments below

No comments associated with this article