Welcome, Guest |
You have to register before you can post on our site.
|
Forum Statistics |
» Members: 4
» Latest member: fadli
» Forum threads: 7
» Forum posts: 13
Full Statistics
|
Online Users |
There is currently 1 user online » 0 Member(s) | 1 Guest(s)
|
|
|
[Sequelize] Membuat slug otomatis |
Posted by: adminustrator - 11-07-2024, 01:09 PM - Forum: Database Programming
- No Replies
|
|
Untuk menerapkan logika di mana kolom slug secara otomatis terisi berdasarkan kolom nama_produk, Anda bisa menggunakan model Sequelize dengan hook untuk secara otomatis mengisi slug setiap kali terjadi operasi create atau update.
Contoh implementasinya seperti ini:
- Buat Model Produk dengan kolom nama_produk dan slug.
- Gunakan hook beforeCreate dan beforeUpdate di dalam model untuk mengisi nilai slug sebelum data disimpan.
Berikut contoh kode lengkapnya:
Code: const { Sequelize, DataTypes, Model } = require('sequelize');
const sequelize = new Sequelize('postgres://user:password@localhost:5432/database_name');
// Helper untuk membuat slug
const generateSlug = (name) => {
return name
.toLowerCase()
.replace(/[^a-z0-9]+/g, '-') // Ganti karakter selain alfanumerik dengan "-"
.replace(/^-+|-+$/g, ''); // Hilangkan "-" di awal atau akhir
};
// Definisikan model Produk
const Produk = sequelize.define('Produk', {
nama_produk: {
type: DataTypes.STRING,
allowNull: false,
},
slug: {
type: DataTypes.STRING,
unique: true,
}
}, {
hooks: {
beforeCreate: (produk) => {
produk.slug = generateSlug(produk.nama_produk);
},
beforeUpdate: (produk) => {
produk.slug = generateSlug(produk.nama_produk);
}
}
});
// Sinkronisasi model ke database
(async () => {
try {
// Contoh penggunaan
const produkBaru = await Produk.create({
nama_produk: 'Produk Baru Contoh',
});
console.log(produkBaru.toJSON());
} catch (error) {
console.error("Error:", error);
}
})();
|
|
|
Laravel Blueprint Macro |
Posted by: adminustrator - 10-18-2024, 01:04 AM - Forum: Database
- No Replies
|
|
DRY untuk kolom-kolom tabelmu!
Bismillahirrahmanirrahim
Apakah kamu pernah merancang desain struktur database dan menemukan bahwa ada beberapa kolom yang hampir selalu ada di setiap tabelnya? Lebih memukau lagi bahwa kamu selalu menulis ulang di setiap file migration-nya? Apakah ada cara agar kamu tidak menulis ulang kolom-kolom tersebut di hampir setiap file migration yang ada?
Studi Kasus
Misalnya saya selalu ingin memasukkan beberapa kolom ini:
- created_by
- updated_by
- deleted_by
- created_at
- updated_at
- deleted_at
Maka di setiap file migration harus selalu ada baris ini:
PHP Code: $table->string('created_by', 150)->nullable()->default('Sistem'); $table->string('updated_by', 150)->nullable()->default('Sistem'); $table->string('deleted_by', 150)->nullable(); $table->timestamps(); $table->softDeletes();
Sudah terbayang bagaimana repotnya untuk melakukan copy-paste setiap menambah file migration baru?
Solusi
Ada 2 cara yang saya tau untuk menangani masalah perulangan di atas, antara lain:
- Lewat file AppServiceProvider.php yang terdapat di folder app/Providers.
- Menggunakan Trait.
Keduanya tetap memanfaatkan fitur Macro pada Blueprint. Pada artikel ini saya mengesampingkan teori dan lebih mengedepankan prakteknya.
Mari kita mulai ngoding!
Lewat AppServiceProvider
Dalam function boot, tambahkan kode berikut:
PHP Code: // Blueprint Macro Blueprint::macro('opsFields', function () { $this->string('created_by', 150)->nullable()->default('Sistem'); $this->string('updated_by', 150)->nullable()->default('Sistem'); $this->string('deleted_by', 150)->nullable(); $this->timestamps(); $this->softDeletes(); });
Maka jika kamu butuh kolom-kolom tersebut dalam file migration, maka cukup tambahkan saja $table->opsFields() di dalamnya. Contohnya jadi seperti ini:
PHP Code: Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('code', 7)->unique(); $table->string('name', 150); $table->opsFields(); });
Menggunakan Trait
Buat sebuah class baru dengan perintah php artisan make:trait OpsFields dan tuliskan isinya sebagai berikut:
PHP Code: public function opsFields(Blueprint $table): void { $table->string('created_by', 150)->nullable()->default('Sistem'); $table->string('updated_by', 150)->nullable()->default('Sistem'); $table->string('deleted_by', 150)->nullable(); $table->timestamps(); $table->softDeletes(); }
File trait selengkapnya jadi seperti ini:
PHP Code: <?php
namespace App\Traits;
use Illuminate\Database\Schema\Blueprint;
trait OpsFields { public function opsFields(Blueprint $table): void { $table->string('created_by', 150)->nullable()->default('Sistem'); $table->string('updated_by', 150)->nullable()->default('Sistem'); $table->string('deleted_by', 150)->nullable(); $table->timestamps(); $table->softDeletes(); } }
Maka jika kamu butuh kolom-kolom tersebut dalam file migration, maka cukup tambahkan saja $table->opsFields() di dalamnya. Contohnya jadi seperti ini:
PHP Code: Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('code', 7)->unique(); $table->string('name', 150); $this->opsFields($table); });
Jangan lupa tambahkan namespace pada bagian atas file migration-nya:
PHP Code: use App\Traits\OpsFields;
Selengkapnya jadi seperti ini file migration-nya
PHP Code: <?php
use App\Traits\OpsFields; use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema;
return new class extends Migration { use OpsFields; /** * Run the migrations. */ public function up(): void { Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('code', 7)->unique(); $table->string('name', 150); $this->opsFields($table); }); }
/** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('categories'); } };
Hasil
Jika kamu coba jalankan perintah di terminal sebagai berikut php artisan migrate --pretend, maka akan menghasilkan query sebagai berikut:
PHP Code: create table `categories` ( `id` bigint unsigned not null auto_increment primary key, `code` varchar(7) not null, `name` varchar(150) not null, `created_by` varchar(150) null default 'Sistem', `updated_by` varchar(150) null default 'Sistem', `deleted_by` varchar(150) null, `created_at` timestamp null, `updated_at` timestamp null, `deleted_at` timestamp null ) default character set utf8mb4 collate 'utf8mb4_unicode_ci';
alter table `categories` add unique `categories_code_unique`(`code`);
Nah, silahkan kamu pilih mau pakai metode yang mana. Apakah lewat service provider atau trait. Pilihan saya? Trait. Mengapa?
Jika menggunakan Trait, maka ia akan hadir jika dipanggil saja. Adapun jika service provider, sejatinya ia akan selalu dipanggil di setiap request, tentang migration atau lainnya.
|
|
|
Mengatur ID Increment Selanjutnya pada PostgreSQL dan MySQL |
Posted by: adminustrator - 10-17-2024, 06:09 PM - Forum: Database Programming
- Replies (1)
|
|
Bismillahirrahmanirrahim
Bermula dari error yang saya temukan saat ingin menambahkan data lewat CMS dan keharusan saya untuk menuliskan nilai pada kolom "id" yang seharusnya terisi sendiri meski dikosongkan, maka saya mengambil keputusan bahwa ada yang keliru dengan nilai increment selanjutnya. Sebenarnya, kesulitan saya ini terjadi di PostgreSQL karena untuk menentukan nilai increment selanjutnya tidak semudah di MySQL dengan DBeaver sebagai Database GUI utama.
Pada MySQL, untuk menentukan nilai auto-increment selanjutnya bisa dilihat dan ditentukan tanpa menggunakan query. Cukup lihat pada properties tabel yang diinginkan, lalu ubah dan klik simpan.
[Image: https://cdn.hashnode.com/res/hashnode/im...ormat=webp]
Pada PostgreSQL, tampilan properties tabelnya tidak seperti di atas, melainkan seperti ini:
[Image: https://cdn.hashnode.com/res/hashnode/im...ormat=webp]
Tidak terlihat pengaturan auto-increment-nya, kan?
Yah begitu lah keterbatasan Database GUI Editor, tidak akan semudah dan sefleksibel command line pada terminal.
Setelah googling sana-sini, beginilah cara mengetahui nilai increment selanjutnya dan cara mengatur nilai increment selanjutnya pada PostgreSQL maupun MySQL.
PostgreSQL
Mengetahui nilai increment selanjutnya
Code: SELECT nextval('nama_sequence');
Pertanyaannya, bagaimana mengetahui nama_sequence pada tabel tertentu itu?
Pada DBeaver, hal itu bisa didapatkan dengan melihat tab Columns dan nilai kolom Defaultnya.
[Image: https://cdn.hashnode.com/res/hashnode/im...ormat=webp]
Namun, untuk mendapatkan nama_sequence menggunakan query adalah sebagai berikut:
Code: SELECT pg_get_serial_sequence('nama_tabel', 'nama_kolom');
-- contoh:
SELECT pg_get_serial_sequence('staff', 'id');
-- contoh response:
-- public.staff_id_seq
Maka, selanjutnya tinggal dibungkus menjadi string dan ditambahkan identifikasi kelas (class) dengan akhiran ::regclass dan tanpa awalan public.-nya.
Hasil akhirnya adalah berupa sequence_name : 'staff_id_seq'::regclass
Untuk mendapatkan nilai increment selanjutnya, bisa dengan query berikut:
Code: SELECT nextval('staff_id_seq'::regclass);
-- output
-- kolom : nextval
-- nilai : 853
Mengatur nilai increment selanjutnya
Code: SELECT setval('nama_sequence', nilai_baru);
Jika mengikuti contoh kolom di atas, maka query lengkapnya akan seperti ini:
Code: SELECT setval('staff_id_seq'::regclass, 860);
MySQL
Mengetahui nilai increment selanjutnya
Ada dua cara atau query untuk mendapatkan hal tersebut, yakni query panjang dan pendek. Mari kita mulai dengan query panjang dahulu, yaitu seperti ini:
Code: SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'nama_database'
AND TABLE_NAME = 'nama_tabel';
Contohnya seperti ini:
Code: SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'daycare'
AND TABLE_NAME = 'staff';
-- output
-- kolom : AUTO_INCREMENT
-- nilai : 853
Adapun query pendeknya bisa seperti ini :
Code: SHOW TABLE STATUS LIKE 'nama_tabel';
Contohnya seperti ini:
Code: SHOW TABLE STATUS LIKE 'staff';
-- output
-- kolom : Auto_increment
-- nilai : 853
Kemudian lihat hasil pada kolom 'Auto_increment'. Angka yang tampil adalah yang menjadi nilai increment selanjutnya.
Mengatur nilai increment selanjutnya
Untuk mengatur atau override nilai increment selanjutnya, bisa dicapai dengan query berikut:
Code: ALTER TABLE nama_tabel AUTO_INCREMENT = nilai_baru;
Contohnya seperti ini:
Code: ALTER TABLE staff AUTO_INCREMENT = 860;
Ya, kira-kira demikian untuk mengetahui dan mengatur nilai increment selanjutnya pada PostgreSQL dan MySQL. Maafkan jika ada kekurangan dan mohon koreksi jika ada kekeliruan.
|
|
|
THANK YOU |
Posted by: adminustrator - 10-14-2024, 03:07 PM - Forum: Announcements
- No Replies
|
|
Berikut adalah sebuah fitur yang mengizinkan kita untuk menyembunyikan sebuah konten dan akan tampil jika orang memberikan "terima kasih" pada postingan tersebut. Seperti di bawah ini, kamu akan melihat tulisan "You must click thanks to see this content..."
Bagaimana cara membuatnya? Cukup bungkus konten yg kalian ingin diapresiasi dengan tag hide.
PHP Code: [hide] Konteks yang ingin diapresiasi [/hide]
Pastikan kontennya hanya berupa hal yang sederhana, seperti:- link
- gambar
- video
- apapun yang sekiranya hanya 1 baris
Previewnya di bawah ini:
Register or login to see this content
Demikan tentang fitur "Terima kasih", semoga membantu.
|
|
|
Logo Forum |
Posted by: adminustrator - 10-14-2024, 10:54 AM - Forum: Feedback & Suggestions
- Replies (4)
|
|
Assalamu'alaikum warahmatullahi wabarakatuh
Karena forum ini masih baru dan saya juga termasuk orang yang awam soal desain, jadi di sini mau minta tolong untuk partisipasi dan kontribusi teman-teman untuk membuat logo agar logo MyBB paling atas sebelah kiri itu diganti dengan yang sesuai dengan komunitas ini, yaitu Laravel ID.
Brief-nya sih sederhana saja:
- Ada teks Laravel ID,
- Ada bendera Indonesia, dan
- Berukuran 224 x 75 pixels
Mungkin sekiranya teman-teman memiliki kemampuan dan waktu, saya sangat berterima kasih sekali jika ada yang membantu. Sekali lagi, sebelum dan sesudahnya, saya ucapkan banyak terima kasih.
|
|
|
|