laravel 与和加入冲突

时间:2021-03-12 10:14:26

标签: laravel eloquent

我对 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 的另一个用户?

我做错了吗?

2 个答案:

答案 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();
}
相关问题