Php Laravel未定义变量:搜索函数的位置错误
我有一个未定义的变量:构建简单搜索函数时发生位置错误。这是我第一次建立一个搜索功能,到目前为止我真的很努力 我有两张表:位置和地标。一个地点可以有许多地标。地标只能有一个位置 我正在尝试搜索一个位置,并希望在搜索时查看存储在数据库中具有Location_id的地标 以下是我的位置模型关系:Php Laravel未定义变量:搜索函数的位置错误,php,laravel,Php,Laravel,我有一个未定义的变量:构建简单搜索函数时发生位置错误。这是我第一次建立一个搜索功能,到目前为止我真的很努力 我有两张表:位置和地标。一个地点可以有许多地标。地标只能有一个位置 我正在尝试搜索一个位置,并希望在搜索时查看存储在数据库中具有Location_id的地标 以下是我的位置模型关系: public function landmarks(){ return $this->hasMany('App\Landmarks'); } 以下是与位置的地标关系: public funct
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 YesRoute::get('/search','SearchController@index')->name('搜索')代码>和在控制器的我的索引方法中-返回视图('pages.search')代码>从未调用您的搜索方法,请求始终调用搜索控制器的索引方法。您可以将搜索函数的内容放入索引函数中,然后将其移动到索引函数中,然后重试。这很有效,谢谢,但现在我出现了一个新错误mb_strops()希望参数1是字符串,给定对象
您可以发布新索引函数的内容吗?
$locations = Locations::whereHas('landmarks', function($query) use ($landmarks) {
$query->where('landmarks', 'LIKE', '%' . $landmarks . '%');
})->get();