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