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.

Yorum Ekle

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gerçek kişi doğrulaması

2 + 2 =