Problem z wyszukiwaniem w Laravel Equivalent

0

Witajcie,
Mam mały problem z wyszukiwaniem w Laraverze. Projekt piszę w Laravel 8.

Mam takie modele / migracje:


    class Category extends Model
    {
        use ScopeActiveTrait,
            NodeTrait,
            HasSlug,
            SoftDeletes;
    
        protected $guarded = ['id'];
    
        protected $fillable = [
            'category_name',
            'description',
            'keywords',
            'content',
            'enable',
            'photo',
            'order',
            'slug',
            '_lft',
            '_rgt',
            'parent_id',
            'value'
        ];
    
        public $timestamps = false;
    
        protected $dates = [
            'deleted_at'
        ];
    
        protected $casts = [
            'order' => 'integer',
            'enable'=>'boolean'
        ];
    
        /**
         * Get the options for generating the slug.
         */
        public function getSlugOptions() : SlugOptions
        {
            return SlugOptions::create()
                ->generateSlugsFrom('category_name')
                ->slugsShouldBeNoLongerThan(160)
                ->saveSlugsTo('slug');
        }
    
    }
    
    public function up()
        {
            Schema::table('categories', function (Blueprint $table) {
                $table->text('value')->after('parent_id')->nullable();
            });
        }
    
    Schema::create('categories', function (Blueprint $table) {
                $table->id();
                $table->string('category_name', 155);
                $table->string('description', 155)->nullable();
                $table->string('keywords', 155)->nullable();
                $table->longText('content')->nullable();
                $table->boolean('enable')->default(false);
                $table->string('photo', 155)->nullable();
                $table->bigInteger('order')->default(0);
                $table->string('slug', 160)->nullable();
                $table->softDeletes();
                NestedSet::columns($table);
                $table->engine = "InnoDB";
                $table->charset = 'utf8mb4';
                $table->collation = 'utf8mb4_unicode_ci';
            });

Używam komponentu: kalnoy/nestedset - ale tutaj nie jest to istotne.

W kolumnie categories.value mam np. taką wartość:

AUDI - TT - 8N (1998-2006) - UKŁAD WYDECHOWY - ELEMENTY MOCUJĄCE

Kiedy próbuję wyszukać za pomocą funkcji:

public function getSelect2(Category $category, Request $request)
    {
        if ($request->search != '' && strlen($request->search) >= 4) {
            $categories = Category::select('id', 'value')
                ->where(function ($query) use ($request) {
                    $query->orWhere('category_name', 'like', '%' . $request->search . '%');
                    $query->orWhere('description', 'like', '%' . $request->search . '%');
                    $query->orWhere('keywords', 'like', '%' . $request->search . '%');
                    $query->orWhere('content', 'like', '%' . $request->search . '%');
                    $query->orWhere('value', 'like', '%' . $request->search . '%');
                })->active()
                ->orderby('order', 'asc')
                ->get();
            $response = array();
            foreach ($categories as $item) {
                $response[] = array(
                    "id" => $item->id,
                    "text" => $item->value
                );
            }
            return $response;
        }
    }

Np. : Audi - mam dużo wyników.
Kiedy wpiszę: 'audi układ' - nie mam żadnego wyniku :(

Jak to naprawić?

0
  • Opcja najłatwiejsza w zaprogramowaniu, lecz najgorsza z punktu widzenia użytkownika:
    Zamieniaj spacje na %, wyszukując %audi%układ%; zadziała to dla podanego przez Ciebie przykładu, lecz zwróci zero rezultatów dla układ audi.
  • Opcja umiarkowana pod obydwoma względami:
    Poszukaj informacji na temat mysql full text search; odpowiednio przygotowana zadziała dla układ audi + będziesz w stanie sortować wyniki względem tego jak bardzo pasują do zapytania użytkownika.
  • Opcja najtrudniejsza w zaprogramowaniu, lecz najwygodniejsza z punktu widzenia użytkownika:
    Elasticsearch; nie dość, że zadziała dla dziwnych zapytań w stylu ukł aud, to jeszcze będziesz w stanie stosunkowo łatwo doimplementować auto-complete.

Rozwiązaniem wykorzystywanym w nowoczesnych serwisach jest na ogół Elasticsearch (oraz inne, podobne bazy danych), lecz czasem wystarczy i zwyczajny full text search z MySQLa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1