Как стремиться загрузить функцию 'user' из ранее установленной красноречивой связи (User Model) в контроллере, когда у меня такая ситуация - PullRequest
0 голосов
/ 08 ноября 2018

ПРИМЕЧАНИЕ: Отношение между моделью Post и Tag много-много, а отношение между пользователем и моделью Post-один-ко-многим. Все работает хорошо У меня слишком много запросов от пользователей, где users.id ... при отладке. Я хочу использовать готовую загрузку для пользовательской функции, в этой ситуации в моей функции контроллера. Как я могу использовать его как with('user')->get();

Спасибо.

Это мой маршрут web.php:

Route::get('/posts/tags/tag/{tag}', 'TagsController@show');

Это моя функция контроллера для этого:

<?php

namespace App \ Http \ Controllers;

использовать Illuminate \ Http \ Request;

использовать App \ Tag; использовать приложение \ Post;

класс TagsController расширяет контроллер {

public function __construct()

{

    $this->middleware('auth')->except(['index']);

}



public function index(Tag $tag)

{


    return view('posts.index', compact('tag'));
}

public function create()

{
    return view('tags.create');
}

public function store(Request $request)

{

    $this->validate(request(), [

        'name' => 'required|max:255'

    ]);

    Tag::create([

        'name' => request('name')            

    ]);


    return redirect('/');
}

public function show(Tag $tag)
{


    return view('tags.show', compact('tag'));
}

}

Это мой show.blade.php:

@foreach ($tag->posts as $post)

              <div class="col-sm-6" >

                  <div class="card" style="margin-bottom:15px;">
                    <img class="card-img-top" src="https://neilpatel-qvjnwj7eutn3.netdna-ssl.com/wp-content/uploads/2015/07/seoimage.jpg" height="270px" alt="Card image cap">
                    <div class="card-body">
                      <h5 class="card-title">
                          <a href="/posts/{{ $post->id }}">
                          {{ $post->title }}
                        </a>
                      </h5>
                      <p class="card-text">
                       {{ substr(strip_tags($post->body), 0, 50) }}{{ strlen(strip_tags($post->body)) > 50 ? "..." : "" }}
                      </p>
                      <p class="card-text"><small class="text-muted">{{ $post->user->name }} on
                                {{ $post->created_at->toFormattedDateString() }}</small></p>
                      <hr>
                      <a href="/posts/{{ $post->id }}" class="btn btn-warning">Go somewhere</a>
                    </div>
                  </div>
                </div>
@endforeach

Это мои запросы (изображения ниже):

ЗАПРОСЫ ИЗОБРАЖЕНИЯ 1

ЗАПРОСЫ ИЗОБРАЖЕНИЯ 2

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Вы можете использовать комбинацию быстрой загрузки и отложенной загрузки в методе show() вашего контроллера. Попробуйте что-то вроде этого:

public function show(Tag $tag)
{
    $tag->load(['posts' => function($query) {   // lazy eager load posts
        $query->with('user');                   // eager load users
    }]);

    return view('tags.show', compact('tag'));
}

https://laravel.com/docs/5.7/eloquent-relationships#lazy-eager-loading

0 голосов
/ 08 ноября 2018

В вашем контроллере вы можете сделать это, как показано ниже, и код блейда останется прежним.

$posts = Post::with('user')->get();

или

$posts = Post::with(['user'])->get();

Надеюсь, это работает для вас.

...