Как настроить окно поиска в laravel - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь вставить окно поиска в свой home.blade, но оно не работает должным образом.

Здесь ниже мой домашний вид

@extends('layouts.app')

@section('content')

    <form action="{{ route('home') }}">

        <div class="p-1 bg-light rounded rounded-pill shadow-sm mb-4">
            <div class="input-group">
                <input type="search" name="search" placeholder="Here the animal serial number..." aria-describedby="button-addon1" class="form-control border-0 bg-light">
                <div class="input-group-append">
                    <button id="button-addon1" type="submit" class="btn btn-link text-primary"><i class="fa fa-search"></i></button>
                </div>
            </div>
        </div>
    </form>
    @foreach($animal as $animal)
        <div class="container">
            <div class="row justify-content-center">
                <div class="col-md-8">
                    <div class="card">
                        <div class="card-header">
                            <h3>Details for the animal</h3>

                        </div>
                        <div class="card-body">
                            <div class="col-12">
                                <p><strong>Id: </strong>{{ $animal->id }}</p>
                                <p><strong>Animal: </strong>{{ $animal->type->category }}</p>
                                <p><strong>Gender: </strong>{{ $animal->gender }}</p>
                                <p><strong>Place Of Birth: </strong>{{ $animal->user->address->city }}</p>
                                <p><strong>Farm: </strong>{{ $animal->user->name }}</p>
                                <p><strong>Date: </strong>{{ $animal->created_at }}</p>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>

    @endforeach
    @if(request()->has('search') && request()->get('search') != '')
        <div class="container">
            <div class="row justify-content-center">
                <div class="col-md-8">
                    <div class="card">
                        <div class="card-header">
                            <h3>Details for the animal</h3>

                        </div>
                        <div class="card-body">
                            <div class="col-12">
                                <p><strong>Id: </strong>{{ $animal->id }}</p>
                                <p><strong>Animal: </strong>{{ $animal->type->category }}</p>
                                <p><strong>Gender: </strong>{{ $animal->gender }}</p>
                                <p><strong>Place Of Birth: </strong>{{ $animal->user->address->city }}</p>
                                <p><strong>Farm: </strong>{{ $animal->user->name }}</p>
                                <p><strong>Date: </strong>{{ $animal->created_at }}</p>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>

    @endif
@endsection

и мой контроллер

public function index()
{
    $animal =Animal::all();
    if (request()->has('search') && request()->get('search') != ''){
        $animal = $animal->where('serial_number', 'like', "%" .request()->get('search')."%");
    }
    return view('home', compact('animal'))->with('message', 'Below is the result');
}

Это приводит меня к ошибке, подобной этой. Свойство [id] не существует в этом экземпляре коллекции. (Просмотр: /Users/macair13/MeatracProject/resources/views/home.blade.php) 'означает, что животное, которое я передал в своем контроллере, не беспокоит.

1 Ответ

1 голос
/ 26 октября 2019

Есть несколько проблем, с которыми нужно разобраться.

1) У вас есть столкновение имени переменной -

@foreach($animal as $animal)

Это перезапишет вашу коллекцию животных ($animal) спервое отдельное животное в этой коллекции. На следующей итерации foreach будет пытаться перебрать каждый элемент этого единственного animal. И эти элементы (например, id) сами по себе не имеют таких свойств, как id, поэтому вы получаете сообщение об ошибке, которую видите.

Вы должны изменить имена переменных, чтобы избежать конфликта, например, соглашение будетиспользовать $animals во множественном числе, чтобы указать, что это набор из более чем одного. Итак:

Контроллер

$animals = Animal::all();
// ...
return view('home', compact('animals')) ...

Вид

@foreach($animals as $animal)

2) Код поиска в вашем контроллере:

$animal = $animal->where(...);

на самом деле не get результаты. Вам нужно добавить get(), , как показано в документах :

$animal = $animal->where(...)->get();

3) Как указывалось в комментариях @Rwd, в вашем представлении есть 2 отдельных фрагмента контента, одинпохоже, он должен отображать коллекцию animals (верхняя с foreach), а вторая, которая выглядит так, должна отображать только результаты поиска. Как и в случае проблемы 1, описанной выше, у вас есть конфликт имен - оба раздела используют $animal. После завершения цикла foreach, $animal - последнее животное в коллекции всех животных, а не результат вашего поиска.

Если я правильно понимаю, вы, вероятно, захотите использовать 2 отдельных имени переменных, возможно,$animals вверху, чтобы отобразить все animals, а затем, возможно, $result, чтобы отобразить один результат поиска.

Если это правда, вам необходимо обновить следующее:

Контроллер

// For the top list of all animals
$animals = Animal::all();

// For the single search result
$result = false;
if (request()->has('search') && request()->get('search') != ''){
    $result = $animal->where(...)->get();
}

// Return them both, separately
return view('home', ['animals' => $animals, 'result' => $result])...;

Просмотр

@foreach($animals as $animal)

// ...

@if($result)
    {{ $result->id }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...