Laravel未定义变量:搜索功能的位置错误

时间:2018-05-10 03:09:28

标签: php laravel

我有一个未定义的变量:位置错误,构建一个简单的搜索功能。这是我第一次构建搜索功能,到目前为止我真的很挣扎。

我有2张桌子:地点和地标。一个地方可以有很多地标。地标只能有一个位置。

我正在尝试搜索位置,并希望在搜索时使用location_id存储在数据库中的地标。

这是我的位置模型关系:

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

以下是该地点的里程碑式关系:

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

我的SearchController:

  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 :(得分:1)

如果你有单个位置和多个里程碑

,你需要循环切换加载的内容
  @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

答案 1 :(得分:0)

您确定错误并不是您错过$landmarks吗?您将位置传递到视图,但随后循环浏览地标。

答案 2 :(得分:0)

更改您的位置模型关系

docker-compose up -d

答案 3 :(得分:0)

由于很明显您的var d = new Date(); var time = d.getHours() + d.getMinutes(); if(time >= 120) { // Do something } 方法永远不会被调用,我们会在您的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(),如果模型中存在关系,将过滤结果< / em>的

您的代码现在看起来像这样:

whereHas()