dima9595
@dima9595
Junior PHP

Почему делаются дубли запросов?

Продолжаю разбираться с вопросом Как получить авторов (пользователей) с использованием нетерпеливой ленивой загрузкой?. Застигла беда с пагинацией. Как я понимаю, правильно сделать пагинацию сделать у меня не получилось. Кто нибудь сталкивался с такой же задачей и как это исправить, если конечно можно это сделать?

Контроллер (стандартный):
/* Страница профиля */
	public function getAccount(string $login = null){
		$withUser = User::withUser($login);

		if($withUser){
			return view('Account.getAccount', ['user' => $withUser]);
		}

		return abort(404);
	}


Модель User:
class User extends Authenticatable{
    use Notifiable;
    protected $table = 'users';
    protected $primaryKey = 'id_users';

	/* Получаем все зависимости */
	public static function withUser(string $login){
		$user = User::where('login_users', $login)->first();   // Получаем данные о пользователе

		if($user){
			$user->load(['getUserPosts' => function($posts){
				$posts->orderBy('id_posts');
			}]);
			$user->load(['getUserVideo' => function($videos){
				$videos->orderBy('id_videos');
			}]);
		}

		return $user;    // Отдаём эти данные
	}

	/* Получаем все посты со страницы пользователя */
	public function getUserPosts(){
		return $this->hasMany(Posts::class, 'author_posts', 'id_users');
	}

	/* Получаем список видео у пользователя */
	public function getUserVideo(){
		return $this->hasMany(Video::class, 'author_videos', 'id_users');
	}
}


View:
Это вкладки для табов, которые тоже подключается через @include. Тут показывается общее количество постов и видео пользователя.
<div class="card-panel">
    <ul class="tabs">
        <li class="tab col s6">
            <a href="#posts">Посты
                <span class="new badge" data-badge-caption="">
                    {{ $user->getUserPosts->count() }}
                </span>
            </a>
        </li>

        <li class="tab col s6">
            <a href="#video">Видео
                <span class="new badge" data-badge-caption="">
                    {{ $user->getUserVideo->count() }}
                </span>
            </a>
        </li>
    </ul>
</div>


Это 2 таба, подключаемых через @include. Тут выводятся посты и видео, переключаемым табом (Данные грузятся сразу вместе, т.е. без перезагрузки странцы и без AJAX)
@forelse($user->getUserPosts()->paginate(3) as $posts)
    <div class="card horizontal">
        <div class="card-image">
            <img src="https://semantic-ui.com/images/avatar2/large/kristy.png">
        </div>

        <div class="card-stacked">
            <div class="card-content">
                <div class="chips">
                    <div class="chip">
                        <img src="https://semantic-ui.com/images/avatar2/large/kristy.png" alt="Contact Person">
                        {{ $user->login_users }}
                    </div>

                    <div class="chip">
                        <i class="material-icons small">access_time</i>
                        {{ LocalizedCarbon::instance($posts->created_at)->diffForHumans() }}
                    </div>
                </div>

                <p>{{ $posts->text_posts }}</p>
            </div>
        </div>
    </div>

    <div class="ui divider"></div>
@empty
Нет постов
@endforelse

{{ $user->getUserPosts()->paginate(3)->links() }}

@forelse($user->getUserVideo as $video)
    <div class="col s6">
        <div class="card">
            <div class="card-image">
                <a href="{{ URL::route('Videos.getVideoID', $video->id_videos) }}">
                    <img src="http://neurogadget.net/wp-content/uploads/2016/12/Minecraft-Pocket-Edition.png">
                </a>

                <span class="card-title">{{ $video->title_videos }}</span>

                @if(!$video->stream_videos)
                    <a href="{{ URL::route('Videos.getVideos') }}" class="btn-floating halfway-fab waves-effect waves-light blue tooltipped left" data-position="top" data-delay="50" data-tooltip="Видеозапись">
                        <i class="material-icons">play_arrow</i>
                    </a>
                @endif

                @if($video->stream_videos)
                    <a href="{{ URL::route('Videos.getVideos') }}" class="btn-floating pulse halfway-fab waves-effect waves-light red tooltipped" data-position="top" data-delay="50" data-tooltip="Трансляция">
                        <i class="material-icons">play_arrow</i>
                    </a>
                @endif
            </div>

            {{--<div class="card-action">--}}
                {{--<a href="#">This is a link</a>--}}
            {{--</div>--}}
        </div>
    </div>
@empty
Нет видео
@endforelse


Как лучше это сделать? При этом необходимо узнавать сколько постов и видео есть у пользователя, получать сами посты и видео от пользователя с пагинацией.
  • Вопрос задан
  • 165 просмотров
Пригласить эксперта
Ответы на вопрос 1
@anlamas
Данные во view вы должны передавать методом paginate($count)
Пример из документации
public function index()
    {
        $users = DB::table('users')->paginate(15);

        return view('user.index', ['users' => $users]);
    }

В самом view
{{ $users->links() }}
На англ Pagination
На русском Страничный вывод
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы