Laravel merupakan framework yang cukup populer saat ini, selain dari pengembangan nya yang cepat, untuk sekarang saja release terbarunya sudah versi 9, saya sendiri lebih sering menggunakan laravel dalam pembuatan backend website nya.
mungkin sebagian dari teman-teman ada yang menggunakan framework CI (Code Igniter) dan ingin mencoba framework laravel ini. dalam artikel kali ini saya akan membuat fungsi sederhana untuk merubah format sql menjadi format schema dartabase migrasi laravel. saya menggunakan plugin sql-ddl-to-json-schema yang bisa di download di https://www.npmjs.com/package/sql-ddl-to-json-schema dan saya menggunakan vuejs untuk framework frontend nya.
Scriptnya bisa dilihat disini
<template> | |
<div> | |
<textarea append-icon="mdi-content-save" v-model="sql"></textarea> | |
<button @click="parsing" >parse</button> | |
<pre class="overflow-auto"> | |
{{down}} | |
{{ migration }} | |
</pre> | |
</div> | |
</template> | |
<script> | |
import { Parser } from "sql-ddl-to-json-schema"; | |
export default { | |
data() { | |
return { | |
data: [], | |
sql:"", | |
} | |
}, | |
computed: { | |
down(){ | |
return this.data.map((x) => `Schema::dropIfExists("${x.name}")`).join(";"); | |
}, | |
migration() { | |
return this.data.map((x) => { | |
const columns = x.columns.filter(y => ['id','created_at','updated_at'].indexOf(y.name) == -1).map((y) => { | |
let table = ""; | |
if(y.type.datatype === 'decimal') table = `$table->${this.type(y.type)}("${y.name}",${y.type.digits}, ${y.type.decimals})` | |
else if(y.type.datatype === 'enum') table = `$table->${this.type(y.type)}("${y.name}",[${y.type.values.toString()}])` | |
else table = `$table->${this.type(y.type)}("${y.name}")`; | |
if(y.options.default != undefined) table += `->default(${y.options.default})` | |
if(y.options.nullable) table += `->nullable()` | |
return table; | |
}).join(';'); | |
let sql = ` | |
Schema::create("${x.name}", function(Blueprint $table){ | |
$table->id(); | |
${columns}; | |
$table->timestamps(); | |
}); | |
`; | |
if(x["foreignKeys"]){ | |
const foreign = x.foreignKeys.map((y) => | |
`$table->foreign("${y.columns[0].column}") | |
->references("${y.reference.columns[0].column}") | |
->on("${y.reference.table}") | |
->onUpdate('cascade') | |
->onDelete('cascade')` | |
).join(';') | |
sql += `Schema::table("${x.name}", function(Blueprint $table){ | |
${foreign}; | |
});` | |
} | |
return sql; | |
}) | |
} | |
}, | |
mounted () { | |
// this.parsing(); | |
}, | |
methods: { | |
type(data){ | |
if(data.datatype === 'int' && data.width == 1) return "boolean"; | |
else if(data.datatype === 'int' && data.width < 8) return "integer"; | |
else if(data.datatype === 'int' && data.width >= 8) return "foreignId"; | |
else if(data.datatype === 'varchar') return "String"; | |
else return data.datatype | |
}, | |
parsing() { | |
const parser = new Parser("mysql"); | |
const {sql} = this; | |
/** | |
* Read on for available options. | |
*/ | |
const options = {}; | |
/** | |
* Get the JSON Schema if you need to modify it... | |
*/ | |
const jsonSchemaDocuments = parser.feed(sql).toJsonSchemaArray(options); | |
/** | |
* Or explore the compact JSON format... | |
*/ | |
const compactJsonTablesArray = parser | |
.feed(sql) | |
.toCompactJson(parser.results); | |
this.data = compactJsonTablesArray | |
}, | |
}, | |
}; | |
</script> | |
<style lang="scss" scoped></style> |
hasilnya bisa dilihat di gambar berikut
Hasilnya memang belum rapih ya, jadi silahkan di kembangkan jika tertarik
jika ada yang belum mengerti, silahkan ditanyakan di komentar, terimakasih
Comments
Post a Comment