Предел Laravel в пункте whereIn - PullRequest
0 голосов
/ 12 апреля 2019

Я использую laravel 5.7

У меня есть запрос с предложением whereIn

В моем контроллере у меня такой запрос:

$post = Post::whereIn('reply_from_id', [1,2])
            ->orderBy('created_at', 'desc')->get();

Я получаю вывод, как этот:

[
    {
        "id": 3,
        "title": "test reply id 2",
        "reply_from_id": 2
    },
    {
        "id": 4,
        "title": "test reply id 1",
        "reply_from_id": 1
    },
    {
        "id": 5,
        "title": "test reply id 1 again",
        "reply_from_id": 1
    },
    {
        "id": 6,
        "title": "test reply id 1 again and again",
        "reply_from_id": 1
    },
    {
        "id": 7,
        "title": "test reply id 2 again",
        "reply_from_id": 2
    }
]

Я хочу ограничить вывод только 2 данными для каждого идентификатора

, например:

[
    {
        "id": 3,
        "title": "test reply id 2",
        "reply_from_id": 2
    },
    {
        "id": 4,
        "title": "test reply id 1",
        "reply_from_id": 1
    },
    {
        "id": 5,
        "title": "test reply id 1 again",
        "reply_from_id": 1
    },
    {
        "id": 7,
        "title": "test reply id 2 again",
        "reply_from_id": 2
    },

]

Я пытаюсь использовать take() следующим образом:

$post = Post::whereIn('reply_from_id', [1,2])
            ->take(2)
            ->orderBy('created_at', 'desc')->get();

Но это только показ данных, подобных этой

[
    {
        "id": 3,
        "title": "test reply id 2",
        "reply_from_id": 2
    },
    {
        "id": 4,
        "title": "test reply id 1",
        "reply_from_id": 1
    }
]

Как ограничить данные в предложении whereIn?

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

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

Используйте ключевое слово use , чтобы связать переменные с областью действия функции.

Замыкания могут наследовать переменные из родительской области. Любые такие переменные должны быть объявлены в заголовке функции [используя use].

$everyHow = 3;
$ids      = [1,2];
$post     = Post::whereIn("posts.id", function ($query) use ($everyHow, $ids) {
    $query->select("p.id")->from('posts p')
    ->whereRaw('p.id = posts.id')
    ->whereIn("p.reply_from_id", $ids)
    ->orderBy("p.id", "desc")->limit($everyHow);
})->get();

EDIT

Объяснение: Правильная выборка данных при рассмотрении id, который является первичным ключом, и 3 записи каждого response_from_id должны иметь уникальный идентификатор для идентификации и выборки в запросе, следовательно, я взял, где id, это ясно?

0 голосов
/ 12 апреля 2019
$post = Post::whereIn('reply_from_id', [1,2])
            ->limit(1)
            ->orderBy('created_at', 'desc')->get();
$post = Post::whereIn('reply_from_id', [1,2])
            ->limit(1)
            ->orderBy('created_at', 'desc')->first();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...