DEV Community

Muhamad Sulaiman
Muhamad Sulaiman

Posted on

Masukkan data pada dua (2) table yang berbeza sewaktu User Registration.

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).

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
Enter fullscreen mode Exit fullscreen mode

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();
 });
}
Enter fullscreen mode Exit fullscreen mode

Ketiga, laksanakan Migration.

php artisan migrate
Enter fullscreen mode Exit fullscreen mode

Keempat, create Model Student.

php artisan make:model Student
Enter fullscreen mode Exit fullscreen mode

Kelima, hubungkan kedua table. Untuk Model User kita akan kembalikan dengan hasMany.

public function students() {

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

}

Enter fullscreen mode Exit fullscreen mode

Dan untuk Model Student kita kembalikan dengan belongsTo.

public function user() {

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

}
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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

image

Manakala di table users, ianya akan berjalan seperti biasa :
image

Top comments (0)