我对 Laravel 很陌生...我有一个帖子表,它与文章和用户表有关系。在控制器中,我要么获取与搜索条件匹配的所有帖子,要么获取所有帖子。在这两种情况下,我都学会了如何将相关字段添加到集合 $posts 中。
// get all posts matching criteria
if (request('search') && request('search') != '') {
$posts = Post::orderBy($orderBySortField,$sortOrder)
->with(['user:id,name','article:id,title'])
->where('post','like','%'.request('search').'%')
->join('users', 'posts.user_id', '=', 'users.id')
->orWhere('users.name','like','%'.request('search').'%')
->join('articles', 'posts.article_id', '=', 'articles.id')
->orWhere('articles.title','like','%'.request('search').'%')
->get();
// get all posts
} else {
$posts = Post::orderBy($orderBySortField,$sortOrder)
->with(['user:id,name','article:id,title'])
->get();
}
// add related fields
foreach ($posts as $post) {
$post->title = '['.$post->article->title.']';
$post->user = '['.$post->user->name.']';
}
当我得到所有帖子时,查看页面显示的列表中的相关字段是正确的。
但是,如果我搜索特定用户的姓名,我会得到一个列表,其中 $posts->user 的关联不正确。
我可以通过显示最后的查询来计算。
对于所有帖子:
select * from `posts` order by `posts`.`id` desc
select `id`, `name` from `users` where `users`.`id` in (1, 11)
select `id`, `title` from `articles` where `articles`.`id` in (1)
对于用户 'paul' (user_id = 1) 所写的帖子:
select * from `posts` inner join `users` on `posts`.`user_id` = `users`.`id` inner join `articles` on `posts`.`article_id` = `articles`.`id` where `post` like ? or `users`.`name` like ? or `articles`.`title` like ? order by `posts`.`id` desc [where ? = %paul% %paul% %paul% ]
select `id`, `name` from `users` where `users`.`id` in (11)
select `id`, `title` from `articles` where `articles`.`id` in (1)
那么为什么 Laravel 的最后查询会寻找 user_id = 11 的另一个用户?
我做错了吗?
答案 0 :(得分:0)
如果您定义了模型关系,则不必在查询中使用 join
,只需使用 with
函数即可。
使用两者创建重复数据,这就是为什么您收到 incorrectly related
错误。
答案 1 :(得分:0)
更改加入代码 whereHas
// get all posts matching criteria
if (request('search') && request('search') != '') {
$search = request('search');
$posts = Post::orderBy($orderBySortField,$sortOrder)
->with(['user:id,name','article:id,title'])
->where('post','like','%'.$search.'%')
->orWhereHas('user', function($userQuery) use($search){
$userQuery->Where('users.name','like','%'.$search.'%');
})
->orWhereHas('article', function($articleQuery) use($search){
$articleQuery->Where('articles.title','like','%'.$search.'%');
})
->get();
}