Как ограничить количество строк для определенного значения внешнего ключа в Laravel - PullRequest
0 голосов
/ 23 января 2019

У нас есть таблица сообщений, а user_id - это внешний ключ Например, я хочу выбрать сообщения для этих пользователей

$users=[1,2,13,16,17,19];
$posts = Post::whereIn('user_id', $users)->paginate(10);

Но я хочу, чтобы пользователи 1 и 2 имели только два сообщения в выводе, для остальных пользователей число сообщений не ограничено.

Примечание. Пользователь 1 и 2 не всегда находятся в массиве $users, и из-за этого условия один или оба из них могут отсутствовать в массиве.

У вас есть решение для меня?

Ответы [ 5 ]

0 голосов
/ 23 января 2019

вы также можете использовать Группировку параметров следующим образом

DB::table('post')
            ->whereIn('user_id', $users)
            ->where(function ($query) {
                $query->whereIn('user_id', [1,2])->limit(2)
                      ->orWhereNotIn('user_id', [1,2]);
            })
            ->get();
0 голосов
/ 23 января 2019

попробуйте этот метод:

$users = User::whereNotIn('id', [1,2])->pluck('id');
$posts = [];

$posts[] = Post::whereIn('user_id', [1,2])->take(2)->get();
$posts[] = Post::whereIn('user_id', $users)->get();

, если вы хотите получить самую последнюю версию post, используйте вместо этого:

$posts[] = Post::whereIn('user_id', [1,2])->latest('created_at')->take(2)->get();
0 голосов
/ 23 января 2019

Вы можете попробовать эту альтернативу:

$posts = [];
$users=[1,2,13,16,17,19];
$userWithJustTwo = [1,2];
$result = array_intersect($users, $userWithJustTwo); 
$posts[] = Post::whereIn('user_id', $result)->orderBy('created_at', 'desc')->take(2)->get();
$array = array_diff($users, userWithJustTwo);
$posts[] = Post::whereIn('user_id', $array)->get();
0 голосов
/ 23 января 2019

Вы не можете достичь этого в одном запросе, нам нужно взять его отдельно, как это

$users=[1,2,13,16,17,19];
// first take all the post except the two
$posts = Post::whereIn('user_id', $users)->whereNotIn('user_id', [1,2])->get()->toArray();
// then take one user 1 post in desc and limit it by 2
$userOnePost = Post::whereIn('user_id', $users)->where('user_id', 1)->limit(2)->orderBy('post.id', 'desc')->get()->toArray();
// then take one user 2 post in desc and limit it by 2
$userTwoPost = Post::whereIn('user_id', $users)->where('user_id', 2)->limit(2)->orderBy('post.id', 'desc')->get()->toArray();

// merge all the array
$allPost = array_merge(posts,$userOnePost,userTwoPost);
0 голосов
/ 23 января 2019

Вы можете сделать это, используя ->take()

$posts = [];
$users=[1,2,13,16,17,19];

foreach($users as $user)
{
    if($user == 1 || $user == 2)
    {
        $posts[] = Post::where('user_id', $user)->take(2)->get();
    }
    else
    {
       $posts[] = Post::where('user_id', $user)->get();
    }
}

Подробнее на https://laravel.com/docs/5.7/queries

...