Php Laravel未定义变量:搜索函数的位置错误

Php Laravel未定义变量:搜索函数的位置错误,php,laravel,Php,Laravel,我有一个未定义的变量:构建简单搜索函数时发生位置错误。这是我第一次建立一个搜索功能,到目前为止我真的很努力 我有两张表:位置和地标。一个地点可以有许多地标。地标只能有一个位置 我正在尝试搜索一个位置,并希望在搜索时查看存储在数据库中具有Location_id的地标 以下是我的位置模型关系: public function landmarks(){ return $this->hasMany('App\Landmarks'); } 以下是与位置的地标关系: public funct

我有一个未定义的变量:构建简单搜索函数时发生位置错误。这是我第一次建立一个搜索功能,到目前为止我真的很努力

我有两张表:位置和地标。一个地点可以有许多地标。地标只能有一个位置

我正在尝试搜索一个位置,并希望在搜索时查看存储在数据库中具有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');
视图:


@foreach($landmarks作为$landmark)
{{$landmark->name}

@endforeach
您确定错误不是因为缺少
$landmarks
?您正在将位置传递到视图,但随后在地标中循环

您需要在急切加载的内容上循环,如果您有一个位置和多个地标,请尝试下面的内容

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

@endforeach
如果你有多个位置和多个地标在里面,试试下面

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

@endforeach @endforeach
更改您的位置模型关系

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

很明显,您的
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 . '%'); 
}])
此外,我认为您正在尝试获取所有具有与给定关键字匹配的地标的位置。因此,您可以将其更改为
whereHas()
,而不是使用
with()
,以便在模型中存在关系时过滤结果

您的代码现在如下所示:

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

你能
dd($locations)在控制器中查询后立即执行?在控制器中,您正在传递一个名为
$locations
的变量,在您看来,您正在使用一个名为
$landmarks
@BizzyBob的变量。我已经说过,在我的回答中,您正在对此进行评论。我想他需要再次听到:-)当我
dd($locations)时,不会发生任何事情
,对不起,我是一个新手,我一直遇到相同的错误:
未定义变量:位置
没有我的模型被称为地标-强烈建议在命名模型时使用实体的单数形式。我知道-我只是忘了这么做。我将在以后修复它,因为现在我只专注于让搜索工作。我今天需要交这个项目,我将把小东西留到后面。有没有返回与您在上面发布的相同视图的路由?@PaulSantos Yes
Route::get('/search','SearchController@index')->name('搜索')和在控制器的我的索引方法中-
返回视图('pages.search')从未调用您的搜索方法,请求始终调用搜索控制器的索引方法。您可以将搜索函数的内容放入索引函数中,然后将其移动到索引函数中,然后重试。这很有效,谢谢,但现在我出现了一个新错误
mb_strops()希望参数1是字符串,给定对象
您可以发布新索引函数的内容吗?
$locations = Locations::whereHas('landmarks', function($query) use ($landmarks) { 
    $query->where('landmarks', 'LIKE', '%' . $landmarks . '%'); 
})->get();