Ограничение запроса laravel с использованием whereIn - PullRequest
0 голосов
/ 07 мая 2019

Итак, у меня есть запрос, но я не знаю, как лучше. У меня есть 2 класса, как показано ниже:

User.class

class User {
    function posts(){
        return $this->hasMany(Post::class, 'user_id');
    }
}

Post.class

class Post {
    function user(){
        return $this->belongsTo(User::class, 'user_id');
    }
}

и в моем контроллере я хочу получать сообщения для каждого пользователя с ограничением для каждого пользователя НЕ для всех результатов . Вот что у меня в контроллере:

function getPosts(Request $request){
    $user_ids = [1,2,3,4];

    $posts = Post::whereIn('user_id', $user_ids)->latest()->take(10)->get();
    return $posts;
} 

Таким образом, приведенное выше получение даст мне только 10 entries from all из них, но я хочу получить 10 for each user nomatter, сколько идентификаторов пользователей

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Может быть что-то вроде

DB::table('posts as p1')->leftJoin('posts as p2', function($join){
    $join->on('p1.id', '=', 'p2.id')
})->whereIn(p1.user_id, $user_ids)->groupBy('p1.id')->having(COUNT(*) < 10)->orderBy([id, created_at]);

будет работать для вас.для справки вопрос

запрос был

SELECT user_comments.* FROM user_comments
LEFT OUTER JOIN user_comments user_comments_2
ON user_comments.post_id = user_comments_2.post_id 
    AND user_comments.id < user_comments_2.id    
where user_comments.post_id in (x,x,x) 
GROUP BY user_comments.id 
HAVING COUNT(*) < 3 
ORDER BY user_id, created_at

Грубо говоря, в построителе запросов к БД это будет выглядеть как

DB::table('user_comments as uc1')->leftJoin('user_comments as uc2', function($join){
    $join->on('uc1.post_id', '=', 'uc2.post_id')->andOn(uc1.id < uc2.id);
})->whereIn(uc1.post_id, [x,x,x])->groupBy('uc1.id')->having(COUNT(*) < 3)->orderBy([user_id, created_at]);

Я надеюсь, что этополезно для вас и дает вам хорошую идею, чтобы получить его.

0 голосов
/ 07 мая 2019

Вы можете просто ограничить отношения подзапросом:

User::with(['posts' => function($query) {
    return $query->limit(10);
}]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...