Я не могу заполнить форму поиска - PullRequest
0 голосов
/ 13 октября 2019

Я создаю форму поиска для таблицы posts.

Теперь я могу искать описание, но когда я выбираю категорию или дату и выполняю поиск, на странице результатов отображаются все сообщения. Это означает, что функции поиска для категорий и дат не работают.

Я не хочу создавать строгий поиск, поэтому я использовал orWhere запрос.

web.php

Route::get('results', 'ResultsController@index')->name('posts.result');

ResultsController.php

public function index(Request $request)
{
    $keyword = $request->get('keyword');
    $category = $request->get('category_id');
    $date = $request->get('date');

    if ($keyword || $category || $date) {
        $posts = Post::Where('keyword', 'LIKE', '%' . $keyword . '%')
            ->orWhere('category_id', $category)
            ->orWhere('date', $date)
            ->paginate(10);
        return view('posts.result', compact('posts'));
    } else {
        $posts = Post::latest()
            ->orderBy('date', 'asc')
            ->paginate(10);
        return view('posts.result', compact('posts'));
    }
}

публикация таблицы миграции

Schema::create('posts', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('image');
    $table->unsignedBigInteger('category_id');
    $table->string('title');
    $table->string('place');
    $table->string('map');
    $table->date('date');
    $table->string('organizer');
    $table->string('organizer_link');
    $table->timestamp('published_at')->nullable();
    $table->text('description');
    $table->timestamps();
});

result.blade.php

<form action="{{ route('posts.result') }}" class="search" method="GET">
    <input type="text" name="description" class="search_text" placeholder="Enter the key words">
    <select name="category" id="select" class="Genre">
        <option value="" hidden name="category">Category</option>
        @foreach(App\Category::all() as $category)
        <option value="{{$category->id}}">{{$category->name}}</option>
        @endforeach
    </select>
    <input type="text" name="date" class="search_date" id="date" placeholder="Choose date">
    <button type="submit" class="test">
        <i class="fas fa-search "></i>
    </button>
    </div>
</form>

1 Ответ

2 голосов
/ 13 октября 2019

Я попытался настроить ваш код так, чтобы он включал только те параметры поиска, которые фактически переданы. Тем не менее, не смог проверить это, так как я должен уйти, поэтому, пожалуйста, проверьте, если это работает. Код должен работать с любым из тех, которые были переданы независимо, поэтому я должен был сделать массив search и ключ match.

public function index(Request $request)
{
    $keyword = $request->get('keyword');
    $category_id = $request->get('category_id');
    $date = $request->get('date');

    if ($keyword || $category_id || $date) {
        $search = [];
        if (!empty($keyword)) {
            $search[] = [
                'column' => 'keyword',
                'value' => "%{$keyword}%",
                'match' => 'LIKE',
            ];
        }

        if (!empty($category_id)) {
            $search[] = [
                'column' => 'category_id',
                'value' => $category_id,
                'match' => '=',
            ];
        }

        if (!empty($date)) {
            $search[] = [
                'column' => 'date',
                'value' => $date,
                'match' => '=',
            ];
        }

        // by here, we have for sure 1 condition
        $posts = Post::where($search[0]['column'], $search[0]['match'], $search[0]['value']);

        if (count($search) > 1) {
            // multiple conditions, using orWhere
            array_shift($search);
            foreach ($search as $condition) {
                $posts->orWhere($condition['column'], $condition['match'], $condition['value']);
            }
        }

        $posts = $posts->paginate(10);
    } else {
        $posts = Post::latest()
            ->orderBy('date', 'asc')
            ->paginate(10);
    }

    return view('posts.result', compact('posts'));
}

Ваша форма:

<form action="{{ route('posts.result') }}" class="search" method="GET">
    <input type="text" name="keyword" class="search_text" placeholder="Enter the key words">
    <select name="category_id" id="select" class="Genre">
        <option value="" hidden>Category</option>
        @foreach(App\Category::all() as $category)
        <option value="{{$category->id}}">{{$category->name}}</option>
        @endforeach
    </select>
    <input type="text" name="date" class="search_date" id="date" placeholder="Choose date">
    <button type="submit" class="test">
        <i class="fas fa-search "></i>
    </button>
    </div>
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...