Skip to content

Creating Custom Filter

Selahattin edited this page Oct 3, 2015 · 5 revisions

Remember, this package firstly checks whether it is or not custom filter. (except constant parameters). If there is a custom filter for query parameter, applies it. Otherwise, searches this parameter in the table columns and applies.


Which is needed in the case?

1. If you don't want to use table column names clearly with the API parameters:

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. When you need the advanced query:

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);
      });
   }
}