在Laravel中实现搜索:在null上调用成员函数posts()


Implementing search in Laravel: Call to a member function posts() on null

我正试图在Laravel 5中实现类别/子reddit搜索,但我没有得到任何结果。

我一直得到这个错误:

在null上调用成员函数posts()

搜索路径我使用

Route::resource('subreddit', 'SubredditController');
Route::post('search', ['as' => 'search', 'uses' => 'SubredditController@search']);

当我搜索某个东西时,它会将我重定向到localhost/reddit/search

我希望它能重定向到localhost/reddit/subreddit/{id}/search

这是search()SubredditController中的函数

public function search(Request $request, Subreddit $subreddit) {
    $query = Input::get('search');
    $subreddit = Subreddit::with('posts.votes')->with('moderators.user')->where('id', $subreddit->id)->first();
    $posts = $subreddit->posts()->where('title', 'LIKE', '%' . $query . '%');
    $posts->setPath($subreddit->id);
    return view('subreddit.search', compact('query', 'subreddit', 'posts'));
}

dd($subreddit) give null

我不明白为什么当相同的查询在show()方法上工作时返回null。

RouteServiceProvider

$router->model('subreddit', 'App'Subreddit');
$router->model('posts', 'App'Post');
$router->model('moderators', 'App'Moderator');

我使用的路由

Route::resource('posts', 'PostsController');
Route::resource('votes', 'VotesController');
Route::resource('subreddit', 'SubredditController');
Route::resource('subreddit.moderators', 'ModeratorsController');
Route::get('mysubreddits', [
    'as' => 'mysubreddits',
    'uses' => 'SubredditController@mySubreddits'
]);
Route::post('search', ['as' => 'search', 'uses' => 'SubredditController@search']);

编辑:所以我现在得到正确的结果,当我用24替换$subreddit->id,这是我正在查看的子reddit的id。为什么我不能使用$subreddit->id,而我可以在同一控制器的show()方法?

我假设你正在使用路由模型绑定。如果你是,没有理由从数据库中重新加载你的subreddit。

$subreddit上调用load来加载你的关系:

public function search(Request $request, Subreddit $subreddit)
{
    $query = $request->input('search');
    $subreddit->load(['posts.votes', 'moderators.user']);
    $posts = $subreddit->posts()->where('title', 'LIKE', '%'.$query.'%')
                       ->paginate()->setPath($subreddit->id);
    return view('subreddit.search', compact('query', 'subreddit', 'posts'));
}