Pindah maklumat user pada table ke table users dan update user_id secara bulk

Untuk kes ini, terdapat table profail yang menyimpan pelbagai maklumat pengguna dimana bukan semua pengguna mempunyai maklumat tersebut. Jadi, matlamatnya adalah untuk mengasingkan maklumat asas seperti name, email, nokp, email table profail ke table users dan kemaskini user_id pada table yang berkaitan.

Table users telah dicipta untuk mempunyai column name, email, nokp, password dan tidak mempunyai sebarang data. Data pada table users ini akan diambil dari table profail. Kemudian table users akan di isni dan user_id akan di update pada table yang berkaitan

Untuk tugasan ini kita akan menggunakan laravel migration. Hasilkan fail migration dengan jalankan command berikut:

php artisan make:migration get_users_details_from_profail_table --table=users

kemudian tambahkan kod berikut pada bahagian method up()


<?php

public function up()
{
    $tables = [
        'profail' => 'main',
        // must first because all users details is in here            
        'pendidikan' => 'ref',
        'penempatan' => 'ref',
        'perkhidmatan' => 'ref',
    ];
    foreach ($tables as $table => $tableCategory) {
        $users = [];
        foreach (\DB::table($table)->get()->toArray() as $tableName) {
            if (!array_key_exists($tableName->nokp, $users)) {
                // check user exsit                    
                $user = \App\Models\User::where('nokp', $tableName->nokp)->first();
                // if user exist get the id                    
                if ($user) {
                    $users[$tableName->nokp] = $user->id;
                }
                // create user if not exist                    
                if (is_null($user)) {
                    // if no record nama, skip, otherwise user recods will have no name                        
                    if ($tableCategory == 'main') {
                        $user = \App\Models\User::create([
                            'name' => $tableName->nama,
                            'email' => \Illuminate\Support\Str::random(10) . '@gmail.com',
                            'nokp' => $tableName->nokp,
                            'password' => bcrypt('password'),
                            'email_verified_at' => \Carbon\Carbon::now(),
                        ]);
                        $users[$tableName->nokp] = $user->id;
                    }
                }
            }
            if (isset($user->nokp)) {
                \DB::table($table)
                    ->where('nokp', $user->nokp)
                    ->update(['user_id' => $users[$tableName->nokp]]);
            }
        }
    }
}

 

Amaran: Pastikan anda telah membuat backup database.

Kemudian, jalankan command berikut:

php artisan migrate

Oleh kerana task ini agak rumit, tiada fungsi rollback diperlukan. Jadi pastikan anda telah membuat backup database.

Jika anda ingin panduan tambah column user_id secara bulk, klik sini

Post a Comment

Previous Post Next Post