Apakah mungkin kita bisa memanggil fungsi controller ke view di laravel tanpa menggunakan route. Biasanya pada konsep MVC (Model-View-Controller) di laravel, Controller adalah penghubung antara model sebagai pattern atau pola yang menandakan sebagai objek dari database dan view sebagai tampilannya yang diakses menggunakan route. Lalu bagaimana kalau Controller itu sendiri kita jadikan suatu fungsi atau method yang dapat dipanggil ke view, emang bisa ? jawabannya bisa karena pada dasarnya Controller yang ada di laravel itu merupakan kelas kelas yang berisi fungsi atau method yang dapat dipanggil, tetapi perlu diingat ketika fungsi atau mehod yang dibuat dapat dikatakan sebagai Controller jika isinya merupakan penghubung antara Model dan View seperti membuat variabel dari Model kemudian dilempar ke View. Ketika hanya berisi fungsi yang memiliki nilai dia tidak bisa disebut Controller. Biasanya untuk apa sih ? kok bisa bisanya fungsi di Controller dipanggil ke View, kan bisa pke variabel kemudian dilempar. Bagi yang pernah atau fasih memakai laravel solusi ini dipakai pada kasus ketika kita melooping variabel kemudian kita ingin mendapatkan detailnya dari database mau gak mau kita harus membuat query lagi (asumsi : tidak bisa join) di view dengan parameter hasil loopingan yang pertama itu membuat terjadi perulangan dua kali, itu sangat tidak bagus walaupun sangat bisa untuk dilakukan, nah pusing kan ? langsung aja ini caranya :
Sabtu, 18 Mei 2019
Sabtu, 13 April 2019
1.
Python
Pertama, kita buat file python terlebih dahulu. Saya
akan mencoba membuat file python sederhana yang men-generate random data dari
1-100. Disini kita tidak akan langsung mengambil mempassing variable python ke aplikasi
C#, tetapi kita akan menyimpan variable python ke dalam text file terlebih
dahulu. Berikut script pythonnya.
--- Script Python ---
from time import
sleep
import random
filename
="H:/C Sharp Projects/test.txt"
i = 0
#text_file =
open(file_descriptor)
while True:
i = random.randint(0, 100)
text_file = open(filename,
"w")
text_file.write('{}'.format(i))
print(i)
text_file.close()
sleep(0.5)
Kalian bisa mengubah path filename tempat menyimpan
text filenya sesuai kebutuhan kalian.
2.
Visual Studio (Windows Form Application)
Pada bagian ini, kita membuat program untuk
menjalankan file python yang sudah kita buat sebelumnya menggunakan Thread pada
C#, dan membaca hasil text file yang di isi oleh program python tersebut. Untuk
programnya kalian bisa download di link berikut.
Hasilnya akan tampak seperti gambar berikut.
Sebelum kita menekan tombol Start Watching, kita harus
memilih file txt yang akan kita baca dengan menekan tombol Browse. Setelah file
txt terpilih, barulah kita klik Start Watching. *Pastikan file txt yang dipilih
sama dengan file txt yang di write oleh program python
Selasa, 12 Maret 2019
Dalam artikel kali ini, saya akan membahas bagaimana cara memasukkan data ke tabel MySQL melalui Python, mulai dari cara mengkoneksikan Python ke MySQL hingga memasukkan data-data yang telah dibuat ke MySQL melalui Python dengan GUI Tkinter.
Sebelum mulai, MySQL dan Python 2.7 harus sudah terinstall dalam PC anda. Jika belum, anda dapat mendownloadnya di link berikut ini.
Python 2.7.13:
MySQL Community:
Saat anda menginstall MySQL, maka anda akan diminta mengisi username dan password, nantinya username dan password ini akan kita pakai untuk mengkoneksikan Python dan MySQL.
Setelah Python dan MySQL sudah terinstall, maka langkah selanjutnya adalah membuat database dan tabel pada MySQL, pada artikel kali ini saya akan membuat database tentang Dota 2 dengan tabel hero dan abilities. Disini saya anggap pembaca sudah mengerti bagaimana membuat database dan tabel pada MySQL, jadi saya akan langsung lompat ke database saya. Berikut database dota2 yang telah saya buat pada MySQL Command Line Client.
Setelah membuat database dan tabel di MySQL, kita akan membuat sekumpulan data yang akan dibaca oleh python dan menghubungkannya dengan MySQL. Data yang dibuat adalah data yang berekstensi .csv (Comma Separated Values). Untuk membuat file .csv ini, saya menggunakan microsoft excel. Berikut data untuk tabel abilities yang telah saya buat.
Setelah mengetikkan data di microsoft excel, klik save as, lalu pada kolom “save as type” pilih format CSV (Comma delimited) (*.csv).
Jika kita run
full code yang telah saya berikan diatas, maka hasilnya akan seperti berikut.
Setelah membuat database dan tabel di MySQL, kita akan membuat sekumpulan data yang akan dibaca oleh python dan menghubungkannya dengan MySQL. Data yang dibuat adalah data yang berekstensi .csv (Comma Separated Values). Untuk membuat file .csv ini, saya menggunakan microsoft excel. Berikut data untuk tabel abilities yang telah saya buat.
Setelah mengetikkan data di microsoft excel, klik save as, lalu pada kolom “save as type” pilih format CSV (Comma delimited) (*.csv).
Barulah kita dapat memulai program pada Pythonnya.
Berikut adalah link full code yang telah saya buat.
Pertama kita import semua module yang diperlukan
from Tkinter import *
import mysql.connector
import csv, sys
import tkFileDialog
Kita membuat exception handling untuk koneksi ke MySQL
dengan try dan except. Pastikan anda memasukkan nama user dan password MySQL
anda dengan benar, untuk host, karena disini saya hanya mengkoneksikan dengan
MySQL yang berada di PC saya, maka saya gunakan localhost.
try:
conn=mysql.connector.connect(user='root',
password='24Ka103li98sapnjri', host='localhost', database='dota2')
except
mysql.connector.Error as err:
if err.errno ==
errorcode.ER_ACCESS_DENIED_ERROR:
print("Invalid username or
password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("Database does not exist")
else:
print(err)
Lalu, semua code yang berada di dalam class
Application(Frame), adalah code untuk GUI dan fungsi-fungsinya.
Di dalam createWidgets anda dapat membuat label,
button, dan interface lainnya. Disini saya menggunakan fungsi grid() untuk
menempatkan interface pada windows.
Pada bagian __init__ memanggil class createWidgets dan
fungsi pack() untuk widgets GUI ini.
def createWidgets(self):
self.lbl_title = Label(self,
text="Dota 2 Insert Databases",
fg="#fff", bg="#007", padx="20px",
pady="8px", font=("Times New Roman", 18))
self.lbl_hero = Label(self,
text="Choose .csv file for hero data", fg="#fff",
bg="#828282", padx="10px", pady="6px",
font=("Times New Roman", 12))
self.btn_hero = Button(self,
text='Browse', width=8, height=2, command=self.openHeroFile)
self.lbl_title.grid(row=0, column=0,
columnspan=3, sticky=N+E+W)
self.lbl_hero.grid(row=1,
column=0,sticky=W)
self.btn_hero.grid(row=2, column=0)
#Initialize
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()
Didalam def openHeroFile(self): , adalah program utama untuk memasukkan
data-data dari .csv yang kita buat ke dalam MySQL database.
filename =
tkFileDialog.askopenfilename(filetypes = (("Template files",
"*.csv"), ("All files", "*")))
Code diatas adalah untuk membuat sebuah command untuk memilih file dari
directories kita.
Setelah itu, kita buat code untuk membaca setiap baris yang ada pada
file .csv kita.
with open(filename, 'rb') as
f:
reader = csv.reader(f)
Kita buat try
and except lagi karena ada kemungkinan error dalam pembacaan filenya. Lalu kita
uraikan data-data dari .csv yang telah kita buat. Karena data-data yang ada
pada .csv terpisah oleh tanda ‘;’ maka kita harus menggunakan fungsi split(‘;’)
untuk memisahkan data-datanya.
Setelah itu kita
harus membuat data-data tersebut menjadi string dengan menggunakan perintah
str(). Lalu kita buat perintah command yang akan dieksekusi MySQL. Disini saya
ingin membuat dua buah kondisi, jika ID belum ada di dalam tabel, maka kita
gunakan perintah “insert into”, tetapi jika ID sudah ada di dalam tabel, maka
kita gunakan perintah “update”.
try:
for row in reader:
data = row[0].split(';')
hero_id = str(data[0])
hero_name = str(data[1])
print("hero_id =
" + hero_id)
print("hero_name =
" + hero_name)
cmd = "select hero_id
from hero where hero_id = {};".format(hero_id)
cursor = conn.cursor()
cursor.execute(cmd,
hero_id)
recordExist = 0
for r_row in cursor:
recordExist = 1
if recordExist == 1:
cmd = "update hero
set hero_name=%s where hero_id=%s;"
cursor.execute(cmd,
(hero_name, hero_id))
else:
cmd = "insert into
hero values(%s, %s);"
cursor.execute(cmd,
(hero_id, hero_name))
conn.commit()
cursor.close()
conn.close()
except csv.Error as e:
sys.exit('file %s, line %d: %s'
% (filename, reader.line_num, e))
Terakhir, kita
memanggil class Application yang telah kita buat, dan kita buat aplikasi
tersebut terus mengulang dengan perintah .mainloop(). Lalu jika aplikasi sudah
selesai digunakan, kita destroy dengan perintah .destroy().
Karena
sebelumnya kita telah membuka koneksi Python dengan MySQL, maka yang harus
dilakukan saat sudah selesai menggunakan aplikasi adalah dengan menutup
koneksinya, yaitu dengan perintah .close().
root = Tk()
root.resizable(width=False,
height=False)
root.title("Dota 2
Insert Databases")
app =
Application(master=root)
app.mainloop()
conn.close()
root.destroy()
Anda tinggal
menekan tombol Browse dan pilih file .csv yang telah anda buat, maka otomatis
data-data yang ada dalam file .csv tersebut akan dimasukkan ke dalam tabel
database MySQL yang telah dibuat sebelumnya (dalam hal ini, database=dota2).
Kamis, 21 Februari 2019
Untuk membuat model pada framework laravel biasanya kita biasa menggunakan bawaan yang telah disediakan oleh laravel yaitu Eloquent, mengadaptasi pada metode ORM (Object Relational Mapping) yang digunakan untuk mengakses database dalam ruang lingkup sebagai objek. Tentu saja dengan adanya Eloquent ini kita lebih dimudahkan untuk membuat query langsung pada code kita, namun bagaimana kalo kita biasa menggunakan SQL untuk mengakses database atau kita kesulitan untuk merubah SQL syntax yang kompleks ke query builder dari Eloquent itu sendiri. Untuk masalah tersebut kita bisa membuat custom model sendiri dengan membuat class yang berisi fungsi (method) SQL yang mengakses database tanpa menggunakan Eloquent atau kita bisa kombinasikan diantara keduanya. Berikut langkah - langkahnya (jika tanpa eloquent) :
Pastikan koneksi ke database anda sudah benar (lihat di file .env). Lalu buat sebuah folder dengan nama Model (optional) dan buat satu file class php (nama_optional). Saya biasanya menamakan sebuah class diawali dari inisial untuk menandakan file ini bekerja di pattern (pola) yang mana, misal dengan pola MVC (Model, View, Controller) untuk model saya kasih inisial m_{nama model}, untuk controller c_{nama controller} dan view v_{nama view}.
2. Membuat Syntax Pada Class Model
Contoh syntax seperti gambar dibawah, yang perlu dperhatikan adalah :
- Penulisan direktori namespace, karena tadi kita buat classnya di dalam folder App dan Model jadi penulisannya App\Model jika diletakan dalam App saja maka penulisannya hanya namespace App. Karena kalo dari sini sudah salah maka tidak bisa diakses di controller.
- Penulisan use, penggunaan syntax use digunakan untuk mengakses library yang ada di laravel, Karena kita butuhnya untuk mengakses database tanpa eloquent jadi kita ambil library DB.
- Penamaan class, pastikan nama class sama dengan nama file php yang kita buat dan karena kita tidak menggunakan eloquent tidak harus menambahkan extend model setelah nama class.
- Penulisan fungsi (method), pada penulisan method tersebut ada kata public agar class bisa dipanggil di semua class termasuk controller maupun view, static agar fungsi dapat dipanggil langsung terhadap classnya tanpa pembuatan objek baru misal {nama_kelas}::{nama_fungsi}, return adalah nilai akhir yang dihasilkan dari fungsi tersebut. untuk penulisan query pada library DB kita bisa juga menggunakan query builder dari library DB tersebut contoh return DB::table('jenis_ibadah')->get();
- Buat satu controller dengan nama c_ibadah dan jangan lupa untuk mengimport clas custom model yang tadi sudah kita bikin dengan mengisi syntax use App/Model/m_ibadah
- Untuk memanggilnya kita hanya perlu memanggil {nama_class}::{nama_method} kalau pada kasus diatas proses pemanggilannya m_ibadah::getAllIbadah()
- Tanda (::) digunakan seperti halnya dot (.) pada java atau .net untuk memanggil turunan dari class tersebut
- nama method bisa langsung dipangil setelah penulisan class tanpa membuat objek terlebih dahulu karena pada pembahasan diatas kita membuat methodnya dalam bentuk static
- Karena saya tidak membuat view maka untuk melihat tampilannya berhasil atau tidak saya render dalam bentuk json dan jangan lupa untuk mendeklarasikan routenya di routes/web.php dengan menulis Route::get('/showibadah', 'c_ibadah@show');
3. Hasil
- Jalankan browser dengan mengetik link (localhost:8000/showibadah) karena saya menggunakan composer untuk menjalankan artisan laravelnya maka saya menggunakan port 8000
- Walahh.... Hasilnya terlihat seperti dibawah ini
Bagaimana jika kita kombinasikan dengan eloquent
1. Membuat Class Untuk Model
Buat kelas baru dengan nama optional untuk memisahkan antara kelas model yang dikombinasikan dengan Eloquent dan tidak menggunakan Eloquent. Disini saya membuat kelas baru dengan nama m_ibadah_eloquent.
2. Membuat Syntax Pada Class Model
Contoh syntax seperti gambar dibawah, yang perlu dperhatikan adalah :
- Penulisan direktori namespace, karena tadi kita buat classnya di dalam folder App dan Model jadi penulisannya App\Model jika diletakan dalam App saja maka penulisannya hanya namespace App. Karena kalo dari sini sudah salah maka tidak bisa diakses di controller.
- Penulisan use, penggunaan syntax use digunakan untuk mengakses library yang ada di laravel, Karena kita butuhnya untuk mengakses database dengan eloquent jadi kita ambil library Illuminate\Database\Eloquent\Model.
- Penamaan class, pastikan nama class sama dengan nama file php yang kita buat dan karena kita menggunakan eloquent jadi harus menambahkan extend model setelah nama class.
- Penulisan Atrribut Eloquent, kalian yang biasa menggunakan eloquent pastinya udah tau kan cara menuliskan attributnya diawali dengan protected {nama_attribut} bisa kalian pake seuai kebutuhan seperti $table, $primary_key, $fillable, $guarded dan lain-lain kalian bisa liat dokumen tasinya disini link. Dalam kasus ini saya menggunakan $table untuk menetukan tabel yang mana yang ingin dijadikan target dan $primary_key untuk menentukan target kolom mana sebagai primary key
- Penulisan fungsi (method), pada penulisan method tersebut ada kata public agar class bisa dipanggil di semua class termasuk controller maupun view, static agar fungsi dapat dipanggil langsung terhadap classnya tanpa pembuatan objek baru misal {nama_kelas}::{nama_fungsi}, return adalah nilai akhir yang dihasilkan dari fungsi tersebut. untuk penulisan library eloquent kalian bisa menggunakan fungsi - fungsi yang telah disediakan oleh eloquent untuk diakases seperti all(), where(), count(), max(), min() dan lain - lain kalian bisa lihat dokumentasinya disini link. dalam kasus ini saya membuat fungsi dengan nama getSpesificIbadah dengan parameter $id_ibadah, fungsi eloquent yang digunakan where untuk mencari daftar ibadah dengan id_ibadah tertentu.
- Masuk ke conttroler c_ibadah (optional) yang sudah kamu buat tadi kemudian buat satu function dengan nama public function dengan nama showwitheloquent (optional)
- Untuk memanggilnya sama seperti tadi kita hanya perlu memanggil {nama_class}:{nama_method} contoh m_ibadah_eloquent::getSpesificIbadah($parameter).
- Karena saya tidak membuat view maka untuk melihat tampilannya berhasil atau tidak saya render dalam bentuk json dan jangan lupa untuk mendeklarasikan routenya di routes/web.php dengan menulis Route::get('/showwitheloquent', 'c_ibadah@showwitheloquent').
- Jalankan browser dengan mengetik link (localhost:8000/showibadah) karena saya menggunakan composer untuk menjalankan artisan laravelnya maka saya menggunakan port 8000
- Walahh.... Hasilnya terlihat seperti dibawah ini.
https://stackoverflow.com/questions/23658479/laravel-custom-model-methods
https://laracasts.com/discuss/channels/laravel/how-can-i-use-db-facade-in-my-custom-class

