-
Notifications
You must be signed in to change notification settings - Fork 66
Özel Filtre Oluşturma
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.
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.
- İlk olarak kullanıcağınız model için bir
QueryBuilder
sınıfından türeyen bir sınıf oluşturun. - 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(),
.
.
]);
}
}
?>
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);
});
}
}
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);
});
}
}
?>
<?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.