Eloquent ORM'de Erişimci ve Mutatörler

30 Mart 2018 Cuma günü PHP başlığında

Eloquent ORM'de Erişimci ve Mutatörler

Laravel ve Eloquent ORM'de Erişimci (Accessors) ve Mutatörleri (Mutators) kullanarak öznitelikleri (Attributes) nasıl biçimlendireceğimizi göreceğiz.

Erişimciler (Accessors)

Erişimciler, veritabanından aldığımız bilgileri/verileri önceden tanımlı olarak biçimlendirmemize olanak tanır. İki tane örnek verelim. Öznitelikleri türkçe olarak örneklendireceğim (elbette ki veritabanını tasarlarken ingilizce kullanmak gerekiyor)

Veritabanımızdaki tabloda ad ve soyad adlı iki adet sütun olduğunu varsayalım. Normal şartlarda veritabanındaki ad soyad bilgisini görüntülemek istediğimizde

Ad Soyad: {{ mb_ucfirst($uye->ad) . ' ' . mb_ucfirst($uye->soyad) }}

şeklinde kullanırız. Ama aşağıdaki gibi bir metodu, modelimize tanımlarsak, işimizi, daha kullanışlı hale getirebiliriz.

public function getAdSoyadAttribute()
{
    return mb_ucfirst($this->ad) . ' ' . mb_ucfirst($this->soyad);
}

Artık şöyle kullanılabilir: Ad Soyad: {{ $uye->ad_soyad }}

Önceden tanımladığımız metod, bize veri işlemede yardımcı oluyor. Benzer bir örneği para birimi için verebiliriz. Veritabanımızda fiyat adlı bir sütun olsun ve içeriği ondalık sayı olarak tutsun. 1325.00 olan bir değeri normal şartlarda görüntülemek istediğimizde ondalık hali yerine şunu göreceğiz: 1325. Şimdi bunu biçimlendirelim.

/**
 * @return string
 */
public function getFiyatAttribute()
{
    return number_format((float) $this->fiyat, 2, ',', '.') . ' TL';
}

Şimdi, veritabanındaki fiyat değerini görüntülemek istediğimizde TL'ye uygun biçimde görünecektir. Yani 1.325,00 TL şeklinde.

 Mutatörler (Mutators)

Erişimcilerin aksine mutatörler gösterilen veriyi işlemek yerine gelen/alınan veriyi işlemekte bize yardımcı olurlar.

Aşağıdaki örnekte 1.325,00 TL olarak gelen veriyi veritabanına kaydetmeden önce 1325.00 haline çevireceğiz.

/**
 * @param string $deger
 * @return void
 */
public function setFiyatAttribute($deger)
{
    $this->attributes['fiyat'] = (float) str_replace(
        [' TL', '.', ','], 
        [null, null, '.'], 
        $deger
    );
}

Biraz daha basitleştirirsek, gelen şifre değerini veritabanına kaydetmeden evvel md5 ile şifrelenmiş haliyle kaydetmek isteyelim. (Ama tabii siz bunu yapmayın, bcrypt ile saklayın)

/**
 * @param string $deger
 * @return void
 */
public function setSifreAttribute($deger)
{
    $this->attributes['sifre'] = md5($deger);
}

Zaman Mutatörleri

Eloquent, varsayılan olarak created_at ve updated_at sütunlarını Carbon (tarih/saat sınıfı) örneğine dönüştürür. $dates sınıf değişkeni üzerine zaman özniteliği adını (aşağıdaki örnekte silinme_tarihi ve yorum_tarihi) ekleyerek geçerli kılabiliyoruz.

class Gonderi extends Model
{
    protected $dates = [
        'created_at',
        'updated_at',
        'silinme_tarihi', // deleted_at
        'yorum_tarihi', // commented_at
    ];
}

 Tarih Formatları

Varsayılan olarak tarih formatı Y-m-d H:i:s olan formatını değiştirmek için kullanılır. $dateFormat sınıf değişkeni aracılığıyla değiştirilir.

class Gonderi extends Model
{
    protected $dateFormat = 'U'; // Unix zaman damgası cinsine döndürür
}

Öznitelik Biçimlendirme

$casts sınıf değişkeni sayesinde model özniteliklerini biçimlendirebiliyoruz (cast). Bu özellik oldukça kullanışlı. Örneğin, vertabanında bir kullanıcının yönetici olup olmadığını yonetici_mi sütunu ile belirliyoruz. MySQL'de boolean veri türü olmadığı için işimizi görecek veri türü Tiny Integer oluyor. Eğer yönetici ise 1 değilse 0 değerini alacağını varsayalım. Veriyi elde etmek istediğimizde yonetici_mi'in 1 değilde, true olarak biçimlendirmek istiyoruz. Şunu yapmak yeterli geliyor:

class Uye extends Model
{
  protected $casts = [
    'yonetici_mi' => 'boolean',
    'son_giris' => 'timestamp',
    'fiyat' => 'float',
    'yas' => 'integer'
  ]
}

$casts dizisinin ilk elemanında değeri boolean veri türüne biçimlendirmesini söyledik. Diğer elemanlarda da farklı işlemler yaptık. son_giris unix zaman damgasına biçimlenecek. fiyat ondalık sayı tipine biçimlenecek. yas sayı tipine biçimlenecek. Desteklenen biçimlerse şu şekilde: integer, real, float, double, string, boolean, object, array, collection, date, datetime, ve timestamp.

 Dizi ve JSON Biçimlenirme

Dizi biçimlendirme, JSON olarak depolanan veri tiplerinde oldukça kullanışlıdır (MySQL'in 5.7 sürümü JSON veri tipini destekliyor, önceki sürümler için TEXT kullanılabilir).

class Uye extends Model
{
  protected $casts = ['bilgiler' => 'array'];
}

$uye = Uye::findOrFail($id);

$bilgiler = $uye->bilgiler;
$bilgiler['yas'] = 25;
$bilgiler['sehir'] = 'İstanbul';
$uye->bilgiler = $bilgiler;

$uye->save();

Kolay gelsin.


Kaynakça

  1. https://laravel.com/docs/5.6/eloquent-mutators
Eloquent ORM'in Tek Başına Kullanımı

28 Mart 2018 Çarşamba günü PHP başlığında

Eloquent ORM'in Tek Başına Kullanımı

Aşağıda Laravel'in varsayılan ORM'i olan Eloquent'in tek başına, Laravel'den bağımsız şekilde kendi projelerimizde nasıl kullanabileceğimizden bahsettim.

Evvela composer paket yöneticisiyle projemizi oluşturalım.

PHP 7 altındaki sürümler için kullanmanız gereken sürüm 5.4 olanı. 5.5 ve üstü olanlar PHP 7 gerektiriyor. Eğer PHP 7 ile çalışacaksanız sürüm belirtmeden gerekliliği indirebilirsiniz.

$ composer require illuminate/database:5.4
Devamını okuyun »
Eloquent İlişkilerinde Koşullu Sorgular

28 Mart 2018 Çarşamba günü PHP başlığında

Eloquent İlişkilerinde Koşullu Sorgular

Aşağıda verdiğim örnekte, Eloquent ile koşullu sorguların ne kadar basit kullanıldığından bahsettim. Örnek içeriği olarak fatura, fatura satırları ve stok kartı üçlüsü üzerinden gittim. Buna birçok yerde ihtiyaç duyulabilir; Kitap ve yazar ilişkilerinde, yorum ve gönderi ilişkilerinde vs.

Elimizde stok kartları (Stock), faturalar (Invoice) ve fatura satırları (InvoiceRow) adında üç adet model olduğunu varsayalım. Stok kartını görüntülemek istediğimizde stok bilgilerinin yanında, mevcut stoğun hangi faturalarda işlem gördüğünü de listelemek gerekecek. Faturalar ve fatura satırları modelleri şöyle olsun:

Invoice.php

// ...
use App\Models\InvoiceRow;

class Invoice extends Model
{
    public function rows()
    {
        return $this->hasMany(InvoiceRows::class);
    }
}
Devamını okuyun »

20 Mart 2018 Salı günü PHP başlığında

PHP ile Basit Bir Router Nasıl Yapılır

PHP'de gelen istekleri (request) cevaplamak (response) için en kullanışlı yöntemlerden birisi router kullanmaktır. Popüler PHP ve PHP olmayan web çatılarının (framework) olmazsa olmazıdır router/yönlendirici/rotacı.

Rotalar, belli özelliklere sahiptir. Bunlardan en önemli üçü şunlardır:

  1. Rota yolu (/sayfa/5, /gonderi/3 gibi)
  2. İstek metdodları (GET, POST, PUT, PATCH, DELETE vs. gibi)
  3. Geri çağırım işlevleri (en basit tabiriyle fonksiyonlar veya sınıf metodları)

Eğer tüm bunları sağlarsak, sağlıklı bir rotacı yaratabilir ve rahatlıkla kullanabiliriz. Bunların dışında middleware(lar) (ara katmanlar olarak çevrilebilir), rota isimlendirmesi gibi birçok özellik/parametreye sahip olabilirler.

Şimdi vereceğim örnekte yalnızca GET ve POST istek metodlarını karşılayacak olan basit bir rotacı yazacağız.

Devamını okuyun »

10 Mart 2018 Cumartesi günü Diğer başlığında

Yeni Bir Görünüm ve Altyapıya Geçtim

Merhaba,

Kısa bir süre önce üzerine çalıştığım bir blog yazılımı vardı, onu bitirdim ve yeni bir görünüm ile birleştirerek arkayüzü ve önyüzü tamamıyle değiştirdim.

Bunu yapmamdaki yegane sebep Wordpress'i beğenmemem. Bir blog sistemi için özellikle benim bireysel olarak kullanabileceğim bir blog sistemi için Wordpress oldukça hantal. Binlerce fonksiyon ve onlarca sınıf çok gereksiz.

Basit bir veritabanı üzerinde içerik, kategori ve yorum tablolarıyla, Slim Framework üzerinde basit bir router ile ufak bir sistem yazdım. Bu sistem bütün ihtiyaçlarımı fazlasıyla karşılıyor.

MacOS Üzerinde Redis Kurulumu ve Ayarlamalar

2 Nisan 2017 Pazar günü Diğer başlığında

MacOS Üzerinde Redis Kurulumu ve Ayarlamalar

Redis, açık kaynak kodlu bir key-value (anahtar-değer) deposudur. Önbellekleme (caching) işlemlerinde çokça kullanılır. Birçok platformda ve birçok programlama dilinde paketleri mevcuttur ve kullanılabilir.

Kurulum için Homebrew paket yöneticisi gerekiyor.

$ brew install redis

komutuyla Redis kurulumu gerçekleştirelim.

Devamını okuyun »
PHP'de MVC Mimarisi İle Basit Bir Blog Uygulaması

2 Nisan 2017 Pazar günü PHP başlığında

PHP'de MVC Mimarisi İle Basit Bir Blog Uygulaması

Daha önceden ufak bir yazı dizisiyle Yeni Başlayanlar için PHP’de MVC başlığında ufak örnekler vermiştik. Bu yazdığımız MVC mimarisini birde blog uygulaması yazılmış halde paylaşmak istedim ve bir blog uygulaması yazdım.

Bu blog uygulamasında yönetim paneli ve ziyaretçi arayüzü mevcut. Detaylara Github deposundan bakabilir ve dosyaları indirebilirsiniz.

2 Nisan 2017 Pazar günü Diğer başlığında

MacOS Üzerinde PostgreSQL Kurulumu

Ruby On Rails ile geliştirmeler yapma amacıyla PostgreSQL veritabanına ihtiyaç duydum. MySQL hali hazırda vardı ama PHP alışkanlıklarımı bir kenara koyup daha fazla olumlu yanı olan PostgreSQL deneyimlemek istedim. MacOS üzerinde iki yöntem var; birincisi Postgres.app uygulaması. Kurulumu oldukça basit; internet sitesinde detayları mevcut. Tıkla, yükle, kullan. Ama ben Homebrew paket yöneticisi aracılığıyla kurulum yapmayı tercih edeceğim.

Devamını okuyun »
İşimizi Kolaylaştıran 10 PHP Kodlama Yöntemi

2 Aralık 2016 Cuma günü PHP başlığında

İşimizi Kolaylaştıran 10 PHP Kodlama Yöntemi

Birçok kod yazıyoruz ve bunları ortaya koyarken herkes farklı yöntemler kullanılıyor. Bu yazıda bazı PHP ipuçlarından bahsedeceğim. Tüm bunlar hem kod kalitemizi arttıracak, hem de bize zaman kazandıracak şeyler olacak.

1. Üçlü (Ternary) Operatör

Üçlü operatör, if/else işlemlerimizi kolaylaştırmamızı sağlayan soru işareti (?) ve iki nokta üst üste (:) işaretiyle oluşturduğumuz bir yöntemdir. Bu yöntem işimizi hem kolaylaştırır hem de hızlı bir hale getirir. Örneğini görelim:

$sayfa = isset($_GET['sayfa']) ? $_GET['sayfa'] : 1;
// veya
echo isset($degisken) ? $degisken : 'Değişken yok!';
Devamını okuyun »
Model Katmanı ve Veritabanı İşlemlerini Kolaylaştırmak

2 Aralık 2016 Cuma günü PHP başlığında

Model Katmanı ve Veritabanı İşlemlerini Kolaylaştırmak

İlk yazıda bahsettiğimiz gibi, model katmanı veritabanı işlemlerimizi düzene sokmak ve kolaylaştırmak adına ihtiyaç duyduğumuz bir katman. Bu yazıda yapacağımız MVC sisteminin model çekirdeğini kodlayacağız. Haydi başlayalım.

/app/core/model.php:

class model
{
    /**
     * Veritabanını nesnesini tutar
     * @var \PDO
     */
    public $db;

    /**
     * Veritabanı nesnesini oluşturur
     */
    public function __construct()
    {
        $this->db = new PDO(DB_DSN, DB_USR, DB_PWD);
    }
}
Devamını okuyun »