lostyazilim
tr.link

Eloquant ORM (laravel) kullananların işine yarayacak bir kaç taktik

3 Mesajlar 1.060 Okunma
lstbozum
tr.link

hsntngr hsntngr Kontör at Kullanıcı
  • Üyelik 21.09.2016
  • Yaş/Cinsiyet 31 / E
  • Meslek Full Stack Developer
  • Konum İstanbul Avrupa
  • Ad Soyad H** T**
  • Mesajlar 1155
  • Beğeniler 99 / 327
  • Ticaret 3, (%100)
Az önce laravel news de gördüğüm bir yazıyı paylaşmak istiyorum :) Bilmeyenler varsa bir çoğunun işine yarayacaktır.

1 - arttırma - azaltma

veritabanında artırmak veya azaltmak istediğiniz sütunları aşağıdaki işlem ile çok daha hızlı yapabilirsiniz.


Article::find($yazi_id)->increment('sayfa_goruntulenme');
Product::find($urun_id)->decrement('kalan_urun'); // -1


2- XorY metodları (varsa şu yoksa bu vs)

>>eğer kayıt varsa getir yoksa 404 hatası ver


$user = User::findOrFail($id);


>>eğer kayıt varsa getir yoksa yeni kayıt oluştur


$user = User::firstOrCreate(['email' => $email]);


3- şarta bağlı ilişkiler, (bunu bende ilk kez görüyorum)

tablolarınız arasında kurduğunuz ilişkileri kullanırken, yani veriyi çekerken filtreleme yapmanıza olanak sağlıyor.


// mesela kullanıcı tablonuz ile yorumlar tablonuz arasında bir ilişki kurdunuz
public function comments() {
return $this->hasMany('App\Comments');
}
// bu yorumları çekerken sayede onaylanmış yorumları çekmek için şöyle bir yol izleyebiliyormuşuz.
public function approvedComments() {
return $this->hasMany('App\Comments')->where('approved', 1)->orderBy('id');
}


4- Model sınıfına üzerinde geliştiricilerin üzerinde değişiklik yapabileceği özellikler



protected $table = 'users'; // bu model hangi tabloya ait
protected $fillable = ['email', 'password']; // bu tabloda hangi alanlar doldurulabilir, düzenlenebilir.
protected $dates = ['created_at', 'deleted_at']; // Carbon sıfının etkin olacağı sütunlar
protected $appends = ['field1', 'field2']; // bu sütunları json formatında döndür (böyle bişey de mi varmış ?)
protected $primaryKey = 'uuid'; // primaryi keyi değiştir
public $incrementing = false; // tablo auto inc değere sahip değil.
protected $perPage = 25; // varsayılan sayfalama ile gösterilen kayıt sayısını değiştirir. (paginate())
const CREATED_AT = 'olusturulma_tarihi';
const UPDATED_AT = 'guncellenme_tarihi';
public $timestamps = false; // tabloda timestamp kullanmayacaksanız bunu modelde belirtmeniz lazım, aksi halde zaten hata veriyor.


5- find metodu ile birden fazla kayıt getirme


$users = User::find([1,2,3]);


6- WhereX


// boyle demek yerine
$yazi = Post::where('slug', 1)->get();
// böyle diyebilirsiniz.
$yazi = Post::whereSlug(1)->get();
// eğer alt tire varsa mesela post_slug ise sütun adı
$yazi = Post::wherePostSlug(1)->get();
// alt tireden sonraki ilk harfi büyük yapıyoruz.


7- null dolduran operatörler
eğer değer null dönüyorsa hata fırlatmasını önlemek için

{{ $post->author->name ?? '' }}
// şahsen optional metodunu tavsiye ederim
// ayrıca eğer ilişkili iki tablo var ve silinen bir kayıt, null dönüyor ancak boş gözükmesin istiyorsanız
public function author()
{
return $this->belongsTo('App\Author')->withDefault([
'name' => 'Guest Author'
]);
}
// diyebilirsiniz. Mesele sitenizde editörler var ve ancak üyeliğini silen editöre ait yazıları diğer bir kullanıcıya veya admine ait gösterebilirsiniz.


8- karmaşık sorgularda closure yapısını kullanarak sorgu içinde minik sorgular oluşturun.


//" WHERE (gender = 'Male' and age >= 18) or (gender = 'Female' and age >= 65)"
// böyle bir sorgumuz var ne yapıcaz ?
$q->where(function ($query) {
$query->where('gender', 'Male')
->where('age', '>=', 18);
})->orWhere(function($query) {
$query->where('gender', 'Female')
->where('age', '>=', 65);
})


9- Global scope'lar

Mesela posts adlı bir tablonuz var ve bu tabloda yer alan yazıları haber, duyuru vs gibi kategorize ediyorsunuz. (Misalen diyorum yoksa dinamik bir kategori sistemi oluşturmak için kullanılmaz)
Hem daha pratik kod hemde daha okunur kod yazmak için bu scope yapısını kullanabilirsiniz.


public function scopeHaberler($query)
{
return $query->where('post_type', 2);
}
//daha sonrada
Post::haberler()->paginate(10);


Daha bir çok şey var, hepsini yazmaya üşeniyorum. Geri kalanları okumak için şu yazıya göz atabilirsiniz :)
https://laravel-news.com/eloquent-tips-tricks
3579

kişi bu mesajı beğendi.

wmaraci
reklam

3579 3579 WM Aracı Anonim Üyelik
  • Üyelik 30.01.2012
  • Yaş/Cinsiyet - /
  • Meslek
  • Konum
  • Ad Soyad ** **
  • Mesajlar 2434
  • Beğeniler 686 / 1151
  • Ticaret 1, (%100)
Laravel'i bir süredir kullanıyorum. Sadece şu kadarını söyleyebilirim, bunca zaman projelerimi sıfırdan başlayıp kodlamakla inanılmaz zaman kaybetmişim.

Yalnız çok fazla tembelliğe alıştırıyor. Bir kez tembelliğin tadını alınca da insan üşeniyor sıfırdan bir şeyler kodlamaya. :D
hsntngr

kişi bu mesajı beğendi.

hsntngr hsntngr Kontör at Kullanıcı
  • Üyelik 21.09.2016
  • Yaş/Cinsiyet 31 / E
  • Meslek Full Stack Developer
  • Konum İstanbul Avrupa
  • Ad Soyad H** T**
  • Mesajlar 1155
  • Beğeniler 99 / 327
  • Ticaret 3, (%100)

Kakarotto adlı üyeden alıntı

Laravel'i bir süredir kullanıyorum. Sadece şu kadarını söyleyebilirim, bunca zaman projelerimi sıfırdan başlayıp kodlamakla inanılmaz zaman kaybetmişim.

Yalnız çok fazla tembelliğe alıştırıyor. Bir kez tembelliğin tadını alınca da insan üşeniyor sıfırdan bir şeyler kodlamaya. :D


laravel bir de üstüne asgard, bir yıl sonra php yi bile unutursunuz hocam doğru diyorsunuz :) Ama teknolojinin nimetlerinden de faydalanmak lazım, ne gerek var aynı şeyleri tekrar tekrar yazmaya
3579

kişi bu mesajı beğendi.

Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al