Я работаю над приложением, похожим на форум, и при просмотре ветки пользователь также может выбрать просмотр сообщения в ветке (определенной).

URL-адрес может иметь вид /thread/29?post=22. Теперь в ветке может быть много сообщений. Следовательно, поскольку он разбит на 10 сообщений на страницу, сообщение может быть на любой странице в зависимости от того, когда оно было опубликовано.

У меня нет возможности узнать, на какой странице записи находится сообщение.

Примечание : запись для разбивки на страницы является динамической.

Мой код:

$posts = Post::where('thread_id', $thread->id)->paginate(10);
//there are over 50+ posts for instance 

Мой упрощенный вид:

@foreach ($posts as $post)

    <span id="post{{ $post->id }}">Post #{{ $post->id }}</span>

    {{ $post->body }}

@endforeach

Мой пример URL будет выглядеть так: http://example.com/thread/1

Как мне узнать, на какой странице есть конкретное сообщение? Скажем, я хочу перейти к сообщению с ID 28, которое принадлежит теме с ID 1. Как мне узнать, на какой странице результата находится эта ветка?

Я хочу сделать что-то вроде:

http://example.com/thread/1?post=28&page=2 //authomatically guessed that post 28 would be in page 2.

Как это сделать? Благодаря!

0
Taylor 7 Май 2016 в 02:46

3 ответа

Лучший ответ

Разделите идентификатор сообщения на 10 и значение ceil. Это, конечно, если каждое сообщение в цепочке начинается с 1 и увеличивается на 1.

$page = ceil($post->id / 10);

Редактировать

Если ваши идентификаторы сообщений являются динамическими, извлеките все сообщения из потока, упорядоченного по дате публикации, и переберите результаты, чтобы найти положение искомого идентификатора. Я не разработчик laravel, поэтому не уверен в синтаксисе запроса, но примерно так:

$searching_id = 28; // searching for page of post id 28
$post_index = 0;    // position of post in ordered posts array
$posts = Post::where('thread_id', $thread->id)->order_by('post_date'); // get all posts ordered by post_date or whatever table field is for post date
foreach ($posts as $post) {
    if ($post->id == $searching_id) {
        break;
    }
    $post_index++;
}
$page = (int)($post_index / 10) + 1;
0
TheDrot 7 Май 2016 в 07:54

Вот как я это сделал:

$post_id = 28;
$posts_per_page = 10;
$posts = Post::where('id', $thread->id)->get();

foreach ($posts as $key => $value) {
    if ($value->id == $post_id) {
        $page = ceil(($key + 1) / $posts_per_page);
        break;
    }
}

// $page = 2
0
kjdion84 4 Мар 2018 в 12:36
$post_id = 28;
$posts_per_page = 10;
$posts = Post::where('id', $thread->id)->get(['id'])->flip();
$index = $posts[$post_id]

$page = ((int) ($index / $posts_per_page) + 1
0
Matt 12 Авг 2019 в 15:11