Masukkan data pada dua (2) table yang berbeza sewaktu User Registration.
Tags: laravel
Published: 2021-09-19 14:21:30

Assalamualaikum dan hai.

Kali ini saya ingin berkongsi bagaimana untuk memasukkan data user ke dalam dua table yang berbeza sewaktu `user registration` pada applikasi kita.

Seperti yang anda lihat pada tag post, kita akan menggunakan Laravel. Dan secara spesifiknya, Laravel 8.

Baru-baru ini saya mendapat sebuah projek yang memerlukan saya untuk membina sebuah borang (form) untuk mengambil data pengguna dan data itu sangat banyak.

Pada mulanya saya kira hanya data biasa seperti Nama, email, dan password. Tetapi tidak. Didalam applikasi yang saya perlu bangunkan, terdapat banyak `User Role` dan setiap data daripada user tersebut berbeza.

Jadi tidak boleh saya gunakan table `users` kerana setiap daripadanya berbeza bukan.

Oleh kerana ini kali pertama saya buat, saya cuba untuk google dan cari di forum bagaimana untuk bangunkan fungsi seperti yang diminta. Saya pasti keyword saya salah dalam pencarian, jadi tidak jumpa.

Akhirnya saya meminta idea kepada seorang rakan yang juga Senior Developer (juga pengasas kepada [Kiah.Store](https://kiah.store)). 

Selepas dia berikan Idea, terus saya laksanakannya. Saya ada terfikir logic yang sama seperti idea yang diberikan. Tetapi entah kenapa saya rasa macam tak yakin nak buat. Haha.

Mari kita laksanakannya.

Pertama, anda perlu buat `Migration` dahulu. Sebagai contoh, `students`.

```
php artisan make:migration create_students_table
```

Kedua, tentukan apa data yang perlu ada dalam table `students`. Yang paling penting, perlu ada kolum `user_id`.

```
public function up(){
 Schema::create('students', function (Blueprint $table) {
  $table->id();
  $table->foreignId('user_id')->constrained()->onDelete('cascade');
  $table->string('work_status');
  $table->timestamps();
 });
}
```

Ketiga, laksanakan `Migration`.
```
php artisan migrate
```

Keempat, create `Model Student`.
```
php artisan make:model Student
```

Kelima, hubungkan kedua table. Untuk `Model User` kita akan kembalikan dengan `hasMany`.
```
public function students() {

  return $this->hasMany(Student::class);

}

```

Dan untuk `Model Student` kita kembalikan dengan `belongsTo`.
```
public function user() {

 return $this->belongsTo(User::class);

}
```

Jangan lupa untuk masukkan $fillable pada `Model Student`.


Keenam, kita perlu arahkan sistem untuk masukkan data kepada table yang berkenaan. Yakni yang kita inginkan, ada data masuk ke table `users`, ada data yang masuk ke table `students`.

Jadi pergi ke `Registration Controller` kita. Saya menggunakan `Controller` bawaan Laravel Breeze. Jadi tempatnya di `App->Http->Controllers->Auth->RegisteredUserController.php`.

Anda boleh terus pergi ke Method Store dimana inilah tempat kita akan laksanakan logic kita.

Secara default, ini adalah yang disediakan.
```
public function store(Request $request) {

  $request->validate([
   'name' => ['required', 'string', 'max:255'],
   'email' => ['required', 'string', 'email', 'max:255', 
   'unique:users'],
   'password' => ['required', 'confirmed', Rules\Password::defaults()],
   ]);

  $user = User::create([
   'name' => $request->name,
   'email' => $request->email,
   'password' => Hash::make($request->password),
  ]);

  event(new Registered($user));

  Auth::login($user);

  return redirect(RouteServiceProvider::HOME);
}
```

Tetapi untuk memenuhi kreteria, ini adalah yang diperlukan.
```
public function store(Request $request) {

  $request->validate([

   'name' => ['required', 'string', 'max:255'],
   'email' => ['required', 'string', 'email', 'max:255', 
   'unique:users'],
   'password' => ['required', 'confirmed', Rules\Password::defaults()],

   // Tambahan validation untuk table students
   'work_status' => ['required']

   ]);

  $user = User::create([
   'name' => $request->name,
   'email' => $request->email,
   'password' => Hash::make($request->password),
  ]);

  // Create dan masuk ke table Students
  $student = Student::create([
   'user_id' => $user->id,
   'work_status' => $request->work_status
]);

  event(new Registered($user));

  Auth::login($user);

  return redirect(RouteServiceProvider::HOME);
}
```

Selepas semuanya selesai, cuba untuk register dan tengok dalam DB. Anda akan dapat hasil seperti ini di table `students`.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c8sispyzt0burrpc10mh.png)

Manakala di table `users`, ianya akan berjalan seperti biasa : 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nvd55pvvzivex3l1j5b7.png)