在Laravel中实现搜索:在null

时间:2015-10-11 21:21:24

标签: php mysql laravel laravel-5

我正在尝试在Laravel 5中实现类别/ subreddit搜索,但我的查询没有得到任何结果。

我一直收到这个错误:

  

在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)给出

我不明白为什么当同一查询在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']);

编辑:当我将$subreddit->id替换为我正在查看的subreddit的id 24时,我现在得到了正确的结果。为什么我无法在同一个控制器的$subreddit->id方法中使用show()

1 个答案:

答案 0 :(得分:2)

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

load上致电$subredditeager load your relationships

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'));
}