CRUD Operations

NexaUI framework menyediakan metode sederhana dan efisien untuk operasi Create, Read, Update, dan Delete (CRUD) melalui NexaModel.

Create (Insert)

Untuk menambahkan data baru ke database, NexaModel menyediakan metode insert():

Insert Data Tunggal


// Insert data tunggal
$data = [
    'username' => 'johndoe',
    'email' => 'john@example.com',
    'password' => password_hash('secret', PASSWORD_DEFAULT),
    'created_at' => date('Y-m-d H:i:s')
];

$success = $this->Storage('users')->insert($data);

// $success akan berisi true jika berhasil, false jika gagal
        

Insert Multiple Records


// Insert multiple records sekaligus
$users = [
    [
        'username' => 'user1',
        'email' => 'user1@example.com',
        'role' => 'member',
        'created_at' => date('Y-m-d H:i:s')
    ],
    [
        'username' => 'user2',
        'email' => 'user2@example.com',
        'role' => 'member',
        'created_at' => date('Y-m-d H:i:s')
    ],
    [
        'username' => 'user3',
        'email' => 'user3@example.com',
        'role' => 'admin',
        'created_at' => date('Y-m-d H:i:s')
    ]
];

$success = $this->Storage('users')->insertMany($users);
        

Insert or Update (Upsert)


// Insert atau update jika sudah ada (berdasarkan unique key)
$data = [
    'email' => 'john@example.com',  // Anggap ini adalah unique key
    'username' => 'johndoe',
    'last_login' => date('Y-m-d H:i:s'),
    'updated_at' => date('Y-m-d H:i:s')
];

// Update semua kolom jika terjadi duplikat
$success = $this->Storage('users')->upsert($data);

// Update hanya kolom tertentu jika terjadi duplikat
$success = $this->Storage('users')->upsert($data, ['last_login', 'updated_at']);
        

Mendapatkan ID Terakhir


// Insert data dan dapatkan ID terakhir
$data = [
    'username' => 'newuser',
    'email' => 'newuser@example.com',
    'created_at' => date('Y-m-d H:i:s')
];

$this->Storage('users')->insert($data);
$lastId = $this->db->lastInsertId();
        

Read (Select)

Untuk membaca data dari database, NexaModel menyediakan berbagai metode:

Mengambil Semua Data


// Mengambil semua data
$users = $this->Storage('users')->get();

// Dengan kolom tertentu
$users = $this->Storage('users')->select('id, username, email')->get();

// Dengan kondisi
$activeUsers = $this->Storage('users')
                   ->where('status', 'active')
                   ->get();
        

Mengambil Satu Baris


// Mengambil baris pertama
$user = $this->Storage('users')->first();

// Mengambil baris berdasarkan ID
$user = $this->Storage('users')->where('id', 1)->first();

// Mengambil baris atau throw exception jika tidak ditemukan
try {
    $user = $this->Storage('users')->where('id', 1)->firstOrFail();
} catch (Exception $e) {
    // Handle error: user tidak ditemukan
}
        

Mengambil Nilai Kolom Tertentu


// Mengambil nilai dari satu kolom
$email = $this->Storage('users')->where('id', 1)->value('email');

// Mengambil array nilai dari satu kolom
$emails = $this->Storage('users')->where('status', 'active')->pluck('email');

// Mengambil array key-value (id => email)
$emailsById = $this->Storage('users')->pluck('email', 'id');
        

Mengecek Keberadaan Data


// Cek apakah data ada
$exists = $this->Storage('users')
               ->where('email', 'john@example.com')
               ->exists();

// Menghitung jumlah baris
$count = $this->Storage('users')
              ->where('status', 'active')
              ->count();
        

Update

Untuk memperbarui data yang sudah ada, NexaModel menyediakan metode update():

Update Data


// Update data dengan kondisi
$data = [
    'status' => 'inactive',
    'updated_at' => date('Y-m-d H:i:s')
];

$success = $this->Storage('users')
                ->where('last_login', '<', '2023-01-01')
                ->update($data);

// $success akan berisi true jika berhasil, false jika gagal
        

Increment dan Decrement


// Increment nilai kolom
$success = $this->Storage('products')
                ->where('id', 1)
                ->increment('views');  // Tambah 1

// Increment dengan nilai tertentu
$success = $this->Storage('products')
                ->where('id', 1)
                ->increment('stock', 5);  // Tambah 5

// Increment dengan update kolom lain
$success = $this->Storage('products')
                ->where('id', 1)
                ->increment('views', 1, ['updated_at' => date('Y-m-d H:i:s')]);

// Decrement nilai kolom
$success = $this->Storage('products')
                ->where('id', 1)
                ->decrement('stock', 2);  // Kurang 2
        

Delete

Untuk menghapus data, NexaModel menyediakan metode delete():

Delete dengan Kondisi


// Delete data dengan kondisi
$success = $this->Storage('users')
                ->where('status', 'inactive')
                ->delete();

// Delete by ID
$success = $this->Storage('users')
                ->where('id', 1)
                ->delete();
        

Force Delete (Hati-hati!)


// Force delete - hati-hati, ini berbahaya!
// Hanya gunakan jika benar-benar yakin dan dengan kondisi WHERE
$success = $this->Storage('logs')
                ->where('created_at', '<', '2023-01-01')
                ->forceDelete();
        

Peringatan: Selalu gunakan kondisi WHERE saat melakukan operasi delete untuk menghindari penghapusan semua data secara tidak sengaja. NexaModel memiliki pengaman untuk mencegah delete tanpa WHERE, tetapi tetap harus berhati-hati.

Transactions

Untuk operasi yang melibatkan beberapa query dan memerlukan konsistensi data, gunakan transactions:


// Menggunakan transaction untuk memastikan konsistensi data
try {
    $this->Storage('users')->transaction(function($db) {
        // Operasi 1: Insert user
        $userId = $db->table('users')->insert([
            'username' => 'newuser',
            'email' => 'newuser@example.com',
            'created_at' => date('Y-m-d H:i:s')
        ]);
        
        // Operasi 2: Insert profile
        $db->table('profiles')->insert([
            'user_id' => $userId,
            'bio' => 'New user profile',
            'created_at' => date('Y-m-d H:i:s')
        ]);
        
        // Jika semua operasi berhasil, transaction akan di-commit
        return true;
    });
    
    // Transaction berhasil
    $this->setFlash('success', 'User berhasil dibuat');
    
} catch (Exception $e) {
    // Jika terjadi error, transaction akan di-rollback
    $this->setFlash('error', 'Gagal membuat user: ' . $e->getMessage());
}
        

Generic CRUD Methods

NexaModel juga menyediakan metode generik untuk operasi CRUD yang lebih sederhana:


// Insert record
$id = $this->Storage('users')->insertRecord('users', [
    'username' => 'newuser',
    'email' => 'newuser@example.com'
]);  // Otomatis menambahkan created_at dan updated_at

// Update record by ID
$success = $this->Storage('users')->updateRecord('users', [
    'status' => 'active',
    'email' => 'updated@example.com'
], 1);  // Otomatis menambahkan updated_at

// Delete record by ID
$success = $this->Storage('users')->deleteRecord('users', 1);

// Find record by ID
$user = $this->Storage('users')->findRecord('users', 1);
        

Best Practices

  • Selalu validasi input sebelum melakukan operasi insert atau update
  • Gunakan transactions untuk operasi yang melibatkan beberapa tabel
  • Hindari melakukan update atau delete tanpa kondisi WHERE
  • Tambahkan timestamp (created_at, updated_at) untuk tracking perubahan data
  • Gunakan prepared statements (sudah otomatis dengan NexaModel) untuk mencegah SQL injection
  • Tangani error dengan try-catch untuk memberikan feedback yang jelas kepada pengguna