Laravel Неопределенная переменная: ошибка местоположения с функцией поиска - PullRequest
0 голосов
/ 10 мая 2018

У меня есть неопределенная переменная: ошибка местоположения при построении простой функции поиска. Я впервые строю функцию поиска, и я до сих пор очень с ней борюсь.

У меня есть 2 таблицы: местоположения и ориентиры. В одном месте может быть много ориентиров. Ориентир может иметь только одно местоположение.

Я пытаюсь найти местоположение и хочу, чтобы ориентиры, хранящиеся в базе данных с помощью location_id, отображались при поиске.

Вот мои отношения модели местоположения:

public function landmarks(){
  return $this->hasMany('App\Landmarks');
}

Вот типичное отношение к локации:

  public function location(){
    return $this->belongsTo('App\Location');
  }

Мой контроллер поиска:

  public function search(Request $request){
      $landmarks = $request->input('location');

      //now get all user and services in one go without looping using eager loading
      //In your foreach() loop, if you have 1000 users you will make 1000 queries

      $locations = Locations::with('landmarks', function($query) use ($landmarks) {
           $query->where('landmarks', 'LIKE', '%' . $landmarks . '%');
      })->get();

      return view('pages.browse', compact('locations'));
  }

Маршрут:

Route::get('/browse', 'SearchController@search');

Вид:

<form action="" class="search-form" method="GET">
    <input type="text" name="location" placeholder="Search" required>
    <button class="search-btn" type="submit"><i class="flaticon-026-search"></i></button>
 </form>

  @foreach($landmarks as $landmark)
    <p>{{$landmark->name}}</p>
  @endforeach

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Поскольку ясно, что ваш метод search() никогда не вызывается, мы переместили содержимое вашей функции в ваш метод index().

public function index(Request $request) { 

    $landmarks = $request->input('location'); 

    $locations = Locations::with(['landmarks', function($query) use ($landmarks) { 
        $query->where('landmarks', 'LIKE', '%' . $landmarks . '%'); 
    }])->get(); 

    return view('pages.search', compact('locations')); 

}

Но тогда вы получили еще одну ошибку:

mb_strpos() expects parameter 1 to be string, object given

Поскольку ваша with() функция неверна, правильный способ сделать это:

with(['landmarks' => function ($query) use($landmarks) {
    $query->where('landmarks', 'LIKE', '%' . $landmarks . '%'); 
}])

Кроме того, я думаю, что вы пытаетесь получить все местоположения , у которых ориентир соответствует данному ключевому слову. Таким образом, вместо with(), , который стремится загрузить отношение , вы можете также изменить его на whereHas(), чтобы отфильтровывал результаты, если в модели . * 1023 существует отношение. *

Ваш код теперь будет выглядеть так:

$locations = Locations::whereHas('landmarks', function($query) use ($landmarks) { 
    $query->where('landmarks', 'LIKE', '%' . $landmarks . '%'); 
})->get(); 
0 голосов
/ 10 мая 2018

Вам нужно перебрать загруженный контент, попробуйте ниже, если у вас есть одно местоположение и несколько ориентиров

  @foreach($locations->landmarks as $landmark)
    <p>{{$landmark->name}}</p>
  @endforeach

если у вас есть многократное местоположение и многократный ориентир внутри, попробуйте ниже

@foreach($locations as $location)
        @foreach($location->landmarks as $landmark)
           <p>{{$landmark->name}}</p>
        @endforeach
  @endforeach
0 голосов
/ 10 мая 2018

Изменить отношение модели местоположения

public function landmarks(){
    return $this->hasMany('App\Landmark');
}
0 голосов
/ 10 мая 2018

Вы уверены, что ошибка не в том, что вы пропустили $landmarks? Вы передаете местоположения в свой вид, но затем просматриваете ориентиры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...