Merubah format Sql ke Laravel Migration



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>
view raw sql-parser.vue hosted with ❤ by GitHub

 

 

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