Laravel Model’de Json Column Kullanımı
Veri tabanları uzuncu bir süredir JSON formatını desteklemekte. Sizde takdir edersiniz ki Json kolonları kullanmak varchar vb. tipleri kullanmaktan biraz farklı. Json formatında key value şeklinde veri tutulabildiği gibi multiple (çok katmanlı) json‘da tutalabiliyor.
Peki Json kolonu, Laravel Eloquent Model‘leri ile nasıl kullanabiliriz ?
Aslında Laravel Eloquent‘e Json tipli kolonları kullanmak pure Sql kodları ile kullanmaktan daha kolay 🙂
Örnek Tablo
Persons isminde bir tablomuz olsun.
Name | Type | Explanation |
name | Varchar | Kişinin Adı |
surname | Varchar | Kişinin Soyadı |
contact_information | Json | Kişiye ait iletişim bilgileri |
Laravel Migration
Yukarıdaki tabloyu oluşturmak için migration dosyasını hazırlayalım.
Schema::create('persons', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->json('contact_information');
$table->timestamps();
});
Laravel Model Casts
Tablomuzu oluşturduk. Json kolonları Array olarak kullanmak için json_encode()
ve json_decode()
methodlarına ihtiyacımız vardı. Laravel Eloquent, bu konuda oldukça güzel bir çözüm sunuyor. protected $casts
dizisine kolunu array olarak kullanmak istediğinizi belirtmeniz yetiyor.
class Person extends Model
{
protected $casts = [
'contact_information' => 'array'
];
}
Eloquent Json Save
Json kolonlara veri eklerken Array göndermeniz yeterli olacaktır.
$newPerson = [
'name' => 'Fatih',
'surname' => 'İRDAY',
'contact_information' => [
"phones" => [
"05xx-xxx-xx-xx",
"0322-xxx-xx-xx",
],
"address" => "... Mh. ... Sk. NO:.. Seyhan/ADANA",
"email" => "fatihirday@gmail.com"
]
];
Person::create($newPerson);
Eloquent Get
Her ne kadar veriler DB’de json formatında tutulsada kullanırken Array formatında kullanmak gerekecektir. Eloquent modeller üzerinden aldığınız json veriler otomatikman Array‘e çevrilir.
$first = Person::first();
dd($first->contact_information);
Yukarıdaki kodun ekran çıktısı:
[
"phones" => [
"05xx-xxx-xx-xx",
"0322-xxx-xx-xx",
],
"address" => "... Mh. ... Sk. NO:.. Seyhan/ADANA",
"email" => "fatihirday@gmail.com"
]
Eloquent Where
Gelelim Json kolon içerisinde where (koşul) kullanmaya.
Json column içinde koşul çalıştırmak için Sql methodları yerine Eloquent‘in sağladığı ->
seçimi mevcut. column_name->json_key->json_subkey
şeklinde bir kullanımı söz konusu.
Diyelimki telefon numarası kaydedilmiş kişilerin listesini çekeceksiniz.
Person::whereNotNull("contact_information->phone")->get();
Yada tam tersi telefon numarası kaydedilmemiş kişiler,
Person::whereNull("contact_information->phone")->get();
Veya email adresini bildiğiniz kişiyi almak istiyorsunuz.
Person::where("contact_information->email", "fatihirday@gmail.com")->first();
Diyelim ki elinizde telefon listesi var ve siz bu listeye uygun olan kişiyi bulmak istiyorsunuz.
Belki bu örnek çok gerçekçi gelmeye bilir ama örneği bozmamak bu şekilde gösterdim. Diyelimki Medias tablonuz var ve her resmin farklı çözünürlükteki path’lerni tuttuğunuz bir dizi mevcut. ve size sadece 100×100 ve 200×200 olanların listesi lazımsa whereJsonContains
methoduna ihtiyacınız olacaktır.
$phones = [
"05xx-xxx-xx-xx",
"0322-xxx-xx-xx",
];
Person::whereJsonContains("contact_information->phones", phones)->first();
JSON EXTRACT
Diyelimki json column‘da grup veri tutunuz.
“Kesinlikle tavsiye etmiyorum, bu durum da relational tablo kullanmaya çalışın.“
[
{"name": "fatih", "surname": "irday", "email":"fatihirday@gmail.com"},
{"name": "tunahan", "surname": "irday", "email":"tunahan@gmail.com"},
{"name": "admin", "surname": "superadmin", "email":"admin@admin.com"},
]
Yukarıdaki gibi veriler tutan Json içersinden, soyadı “irday” olan insanların olduğu kayıtları almak isterseniz.
Model::where(DB::raw('JSON_EXTRACT(contact_information, "$[*].surname")'), "like", "%irday%")->get();
Yukarıda sorgu ile json kolonunda arama koşullarına uygun olan DB kayıtlarını alabilirsiniz.