Skip to content

Özel Filtre Oluşturma

Selahattin Ünlü edited this page Nov 11, 2016 · 10 revisions

Unutmayın, bu paket url üzerinden gönderilen parametrelerde (sabit parametreler dışında) öncelikle sizin oluşturduğunuz özel filtrenin varlığını kontrol eder. Eğer özel bir filtre oluşturduysanız onu uygular, özel filtre oluşturmadığınız taktirde url ile gelen parametreyi tablo sütununda arar ve o sütuna göre filtreleme yapmaya çalışır.


Hangi Durumlarda İhtiyaç Duyulabilir?

1. Tablo isimlerini api parametrelerinde açıkca kullanmak istemiyorsanız:

Tablo sütunlarınızın isimlerinin api parametrelerinde açıkca kullanılmasının güvenlik zaafı oluşturacağını düşünüyorsanız özel filtreler ile bu durumu engelleyebilirsiniz.

Özel filtre ile ?name=Selahattin şeklinde gelen sorguyu name sütunu yerine tablonuzdaki gerçek sütun ismi ile sorgulatabilirsiniz.

  1. İlk olarak kullanıcağınız model için bir QueryBuilder sınıfından türeyen bir sınıf oluşturun.
  2. Daha sonra özel filtreleme uygulanacak olan url ile gelen parametre ismini studly case olacak şekilde ("filterByParameterName") methodunuzu oluşturun.
<?php 
	use Unlu\Laravel\Api\QueryBuilder;

	class UserQueryBuilder extends QueryBuilder
	{
		public function filterByName($query, $name)
		{
	           return $query->where('fullname', $name);
		}
	}
?>

Son olarak controller içerisinde QueryBuilder sınıfı yerine oluşturduğunuz sınıfı kullanın.

<?php 
	namespace App\Whatever\Api\Controllers;

	use App\Http\Requests;
	use App\User;
	use Illuminate\Http\Request;

	// Add this line
	use YourNameSpace\Path\UserQueryBuilder;

	class UsersController extends Controller
	{
	  public function index(Request $request)
	  {
	    $queryBuilder = new UserQueryBuilder(new User, $request);
	    
	    return response->json([
	      'data' => $queryBuilder->paginate()->result(),
	      .
	      .
	    ]);
	  }
	}
?>

2. Çok daha karmaşık where sorgularına ihtiyaç duyduğunuzda:

Basit where sorgularını yerine çok daha karmaşık sorgulara ihtiyaç duyduğunuz zaman da özel filtre oluşturarak bu ihtiyacınızı giderebilirsiniz.

Bu paket herhangi bir özel filtre olmadığında api/users?city_name=Istanbul adresine gelen sorguyu kullandığınız modelin tablosundaki city_name sütununa göre filtrelemeye çalışır.

Fakat sizin users tablonuzda şehirler ile ilgili ilişkilendirmeyi city_id sütunu ile yaptığınızı varsayalım. Bu durumda karmaşık bir where sorgusu oluşturmak için özel filtre oluşturmalısınız.

use Unlu\Laravel\Api\QueryBuilder;

class UserQueryBuilder extends QueryBuilder 
{
   public function filterByCityName($query, $name)
   {
      return $query->whereHas('city', function($q) use ($name) {
         return $q->where('name', $name);
      });
   }
}

Özel Filtrelerden Operatöre (=, !=, <, <=, >, >=) Erişmek

Eğer özel filtreniz içerisinde sadece "=" operatorunu kullanmayacaksanız ve url parametresinde hangi operatorun kullandığına erişmek isterseniz methodunuza bir parametre daha eklemeniz yeterli.

Yani methodunuzu şu şekilde güncellemelisiniz:

<?php 
	use Unlu\Laravel\Api\QueryBuilder;

	class UserQueryBuilder extends QueryBuilder
	{
		public function filterByCityId($query, $id, $operator)
		{
			return $query->whereHas('city', function($q) use ($id, $operator) {
	            return $q->where('id', $operator, $id);
	        });
		}
	}
?>

Özel Filtrelerin tüm parametreleri

<?php 
  use Unlu\Laravel\Api\QueryBuilder;

  class UserQueryBuilder extends QueryBuilder
  {
    public function filterByCityId($query, $value, $operator, $type)
    {
      return $query->whereHas('city', function($q) use ($id, $operator) {
        return $q->where('id', $operator, $id);
      });
    }
  }
?>
  • $type parametresinin ön tanımlı değeri "Basic"tir.
  • whereIn tarzındaki sorgular için $type parametresinin değeri "In" olur.
  • whereNotIn tarzındaki sorgular için $type parametresinin değeri "NotIn" olur.