Merhaba,
Bu yazıda Laravel'de MySQL veritabanının bir özelliği olan Full Text Search kullanımından bahsedeceğim. Örnek projeyi Github üzerinden paylaştım. İndirip inceleyebilirsiniz.
İlk olarak komut satırında masaüstü dizinine gelerek aşağıdaki komutu yazıp yeni bir Laravel projesi oluşturuyorum:
composer create-project --prefer-dist laravel/laravel full-text-search-sample
Sonrasında Xampp yardımıyla yerelde bir veritabanı oluşturuyorum. Proje kök dizinindeki .env dosyasını açarak veritabanı bilgilerini aşağıdaki gibi düzenliyorum:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=fts_db DB_USERNAME=root DB_PASSWORD=
defaultStringLength hatasıyla karşılaşmamak için app/Providers/AppServiceProvider.php dosyasını açarak boot() fonksiyonunu düzenliyorum:
public function boot() { Schema::defaultStringLength(191); }
database/migrations klasörünün içinde users tablosu için otomatik olarak oluşturulan migration dosyasını açıyorum. 'address' adında bir sütun ekleyerek bu sütunu fulltext olarak indeksliyorum:
public function up() { Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->string('address'); $table->rememberToken(); $table->timestamps(); }); DB::statement('ALTER TABLE users ADD FULLTEXT fulltext_index (address)'); }
Şu komutu çalıştırarak veritabanı tablosunun oluşturulmasını sağlıyorum:
php artisan migrate
users tablosunda fake veriler oluşturmak adına seed işlemi yapmam gerekiyor. Bunun için öncelikle bir seeder oluşturuyorum:
php artisan make:seeder UsersTableSeeder
Oluşturduğum seeder'ı database/seeds klasörünün içinde yer alan DatabaseSeeder dosyasının run metoduna ekliyorum:
public function run() { $this->call(UsersTableSeeder::class); }
Ve şu komutu çalıştırarak users tablosunda fake veriler elde etme işlemini tamamlıyorum:
php artisan db:seed
users tablosunun bir kısmı:
FullTextSearch adında bir trait dosyası oluşturup içeriğini şu şekilde dolduruyorum:
<?php namespace App; trait FullTextSearch { public function scopeSearch($query, $term) { $query->whereRaw("MATCH (address) AGAINST (? IN BOOLEAN MODE)" , $term); return $query; } }
User model dosyasına gerekli eklemeleri yapıyorum:
use FullTextSearch; protected $searchable = ['address'];
İşlemi test etmek adına routes/api.php dosyasında bir adet route tanımlıyorum:
Route::post('search', 'UserController@search');
Kullanmak istediğim controller dosyasını oluşturuyorum:
php artisan make:controller UserController
Ve controller dosyamın içeriğini şu şekilde dolduruyorum:
<?php namespace App\Http\Controllers; use App\User; class UserController extends Controller { public function search() { $text = request()->text; $users = User::search($text)->get(); return $users; } }
Artık işlemi test edebilirim:
php artisan serve
Postman üzerinden yapılan istek:
Elde edilen sonuç:
İyi çalışmalar.
Yorumlar Henüz yorum yapılmamış
Yeni Yorum