Welcome, Guest
You have to register before you can post on our site.

Username
  

Password
  





Search Forums

(Advanced Search)

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)

Latest Threads
[Sequelize] Membuat slug ...
Forum: Database Programming
Last Post: adminustrator
11-07-2024, 01:09 PM
» Replies: 0
» Views: 6
Laravel Blueprint Macro
Forum: Database
Last Post: adminustrator
10-18-2024, 01:04 AM
» Replies: 0
» Views: 3
Mengatur ID Increment Sel...
Forum: Database Programming
Last Post: adminustrator
10-17-2024, 06:35 PM
» Replies: 1
» Views: 3
THANK YOU
Forum: Announcements
Last Post: adminustrator
10-14-2024, 03:07 PM
» Replies: 0
» Views: 29
Logo Forum
Forum: Feedback & Suggestions
Last Post: adminustrator
10-14-2024, 02:48 PM
» Replies: 4
» Views: 62
CHIT-CHAT
Forum: Off-Topic / General Discussion
Last Post: adminustrator
10-13-2024, 02:22 PM
» Replies: 0
» Views: 7

 
Lightbulb [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:

  1. Buat Model Produk dengan kolom nama_produk dan slug.
  2. 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);
    }
})();

Print this item

  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:

  1. Lewat file AppServiceProvider.php yang terdapat di folder app/Providers.
  2. 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` (
  `idbigint unsigned not null auto_increment primary key
  `codevarchar(7not null
  `namevarchar(150not null
  `created_byvarchar(150null default 'Sistem'
  `updated_byvarchar(150null default 'Sistem'
  `deleted_byvarchar(150null
  `created_attimestamp null
  `updated_attimestamp null
  `deleted_attimestamp null
) default character set utf8mb4 collate 'utf8mb4_unicode_ci';

alter table `categoriesadd 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.

Print this item

  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.

Print this item

Lightbulb 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:
[hideKonteks 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.

Print this item

  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:

  1. Ada teks Laravel ID,
  2. Ada bendera Indonesia, dan
  3. 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.

Print this item

  CHIT-CHAT
Posted by: adminustrator - 10-13-2024, 02:22 PM - Forum: Off-Topic / General Discussion - No Replies

Mari ngobrol.

Satu..

Dua..

Tiga..

Print this item