Laravel Searchable ile Birden Fazla Model’de Arama Yapın

Laravel Searchable Nedir?

Harici dış bağımlılıklar olmaksızın, model veya modeller içerisinde arama işlemlerini kolay, etkili ve düzenli bir şekilde yapmamızı sağlayan bir paket olarak önümüze gelmektedir. Bazı durumlarda proje içerisinde büyük çaplı arama işlemleri yapmak zorunda kalabiliyoruz. Bu durumlarda yetenekli olduğuna inandığım bir pakettir Searchable. Basit bir örnekleme ile Searchable kullanımını anlatmaya çalışacağım. Öncelikle Searchable paketini projemize kuruyoruz.

Laravel Searchable paketini yüklemek için aşağıdaki komutu çalıştırıyoruz.

composer require spatie/laravel-searchable

Bu işlem tamamlandıktan sonra Searchable kullanımı için harici bir işlem yapmanıza gerek yok.

Modellerimizde Searchable paketini kullanabilmek için modellerimiz üzerinde bazı revizyonlar yapmamız gerekiyor. Model sınıfımıza Searchable interface’ini implements ediyoruz. Daha sonra geçerli model içerisinde yapılan aramaların sonuçlarını alabilmemiz içinde getSearchResult() fonksiyonunu sınıfımıza ekleyerek gerekli düzenlemeleri yapacağız.

Örnek bir Model:

use Illuminate\Database\Eloquent\Model;
use Spatie\Searchable\Searchable;
use Spatie\Searchable\SearchResult;

class ProductCategory extends Model implements Searchable{    protected $primaryKey = "id";
    public $timestamps = true;
    protected $fillable = ['name','desc'];

    public function getSearchResult(): SearchResult
    {
        $url = route('product-categories.show', $this->id);

        return new SearchResult(
            $this,
            $this->name,
            $url
         );
    }

}

Model içerisinde bulunan getSearchResult fonksiyonunda görüldüğü gibi geriye $this, $this->name, $url verileri dönderiliyor. Return içerisinde bulunan $this->name alanını çoğaltarak ihtiyacınıza göre de çıktı alabilirsiniz. Bu model üzerinde yapılan arama sonucunda bize obje, name ve url değişkenleri geri dönecektir.

Şimdi bir controller yazarak arama işlemimizi ProductCategory modeli üzerinde gerçekleştirelim.

use Spatie\Searchable\Search;class SearchController extends Controller
{

    public function search(Request $request)
    {
        $searchterm = $request->input('query');        $searchResults = (new Search())
            ->registerModel(ProductCategory::class, 'name')
            ->perform($searchterm);

        return view('search', compact('searchResults',
                    '$searchterm'));
    }

}

Gördüğünüz gibi bir search fonksiyonu ve fonksiyon içerisinde bir Search nesnesi oluşturuyoruz. ->registerModel(ProductCategory::class, 'name') yöntemi ile arama işlemimizi bu model üzerinde yapacağımızı ve bu modele ait name sütununda aramanın yapılacağını belirtiyoruz. –>registerModel(ProductCategory::class, 'name') yönetimini çoğaltarak birden fazla model içerisinde arama yapabiliriz. Ancak unutmayın her model içerisinde gerekli düzenlemelerin yapılması gerekmektedir.

->registerModel(ProductCategory::class, 'name') son kısmında bulunan 'name') değişkenini değiştirebilir veya çoğaltarak aramayı o modele ait başka sütunlarda da yapabiliriz. Kısacası bir modele ait n sütun üzerinde arama gerçekleştirebiliriz.

SearchController içerisinde bulunan search fonksiyonumuz için tercihe bağlı olarak GET-POST route tanımlayabilirsiniz. Benim tercihim Post metod kullanımı. Artık geriye view işlemlerimiz kaldı. View üzerinde bulunan bir input ile aranacak datayı route’nıza yönlendiriniz ve gelen cevabı parçalayarak sonuçları yazdırınız.

Gelen cevabın parçalanması :

@if(isset($searchResults))
@if ($searchResults-> isEmpty())
<span>Üzgünüz, <b>"{{ $searchterm }}"</b> terimi için hiçbir sonuç bulunamadı.</span>
@else
<span><b>"{{ $searchterm }}"</b> Terimi için Sistem İçerisinde {{ $searchResults->count() }} sonuç bulundu</span>
<hr />
@foreach($searchResults->groupByType() as $type => $modelSearchResults)
@if($type == "ProductCategory")
<br>
<span>Ürün Kategorileri</span>
<br>
@endif
<div class="table-responsive">
<table class="table table-hover mb-0 c_table search_page">
<tbody>
@foreach($modelSearchResults as $searchResult)
<tr>
<td class="span" style="background-color: #3d3d3d;">
<span><a href="{{ $searchResult->url }}" target="_blank">{{ $searchResult->title }}</a></span>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endforeach
@endif
@endif

Arama sonuçlarını bu şekilde ekrana yazdırıyoruz. Searchable paketi bizi büyük bir kod kalabalığından kurtarırken aynı zamanda hızlı ve verimli bir arama yapmamıza olanak sağlıyor. Umarım faydalı olur.

Diğer yazılarımızda görüşmek üzere iyi geliştirmeler dilerim 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir