当我遇到这种情况时,如何从先前在控制器中设置的 eloquent 关系(用户模型)中急切加载 'user' 函数
How to eager load the 'user' function from eloquent relationship previously set (User Model) in controller when I have this situation
注意:Post和Tag模型是多对多关系,User和Post模型是一对多关系。一切正常我只是有太多来自用户的查询 users.id...调试它时。在这种情况下,我想在我的控制器函数中对用户函数使用预先加载。我如何使用它 with('user')->get();
谢谢。
这是我的 web.php 路线:
Route::get('/posts/tags/tag/{tag}', 'TagsController@show');
这是我的控制器功能:
<?php
命名空间App\Http\Controllers;
使用Illuminate\Http\Request;
使用App\Tag;
使用 App\Post;
class 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
这是我的查询(下图):
QUERIES IMAGE 1
QUERIES IMAGE 2
在您的控制器中,您可以像下面这样进行操作,blade 代码保持不变。
$posts = Post::with('user')->get();
或
$posts = Post::with(['user'])->get();
希望这对你有用。
您可以在控制器的 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
注意:Post和Tag模型是多对多关系,User和Post模型是一对多关系。一切正常我只是有太多来自用户的查询 users.id...调试它时。在这种情况下,我想在我的控制器函数中对用户函数使用预先加载。我如何使用它 with('user')->get();
谢谢。
这是我的 web.php 路线:
Route::get('/posts/tags/tag/{tag}', 'TagsController@show');
这是我的控制器功能:
<?php
命名空间App\Http\Controllers;
使用Illuminate\Http\Request;
使用App\Tag; 使用 App\Post;
class 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
这是我的查询(下图):
QUERIES IMAGE 1
QUERIES IMAGE 2
在您的控制器中,您可以像下面这样进行操作,blade 代码保持不变。
$posts = Post::with('user')->get();
或
$posts = Post::with(['user'])->get();
希望这对你有用。
您可以在控制器的 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