我有一个未定义的变量:位置错误,构建一个简单的搜索功能。这是我第一次构建搜索功能,到目前为止我真的很挣扎。
我有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
答案 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()