使用 Eloquent 将两个查询合并为一个
Merging two queries into one using Eloquent
我有这两个查询来显示 3 个表用户、评论和帖子中的信息。所以我做了这个功能:
public function show($id)
{
$posts = Post::with(['comments'])->findOrFail($id);
$user = User::find($posts->user_id);
echo "<h1>".$posts->title.'</h1>';
echo "<h2>".$user->name.'</h2>';
foreach ($posts->comments as $comment) {
echo $comment->body.'<br>';
}
}
在这个函数上我使用了两个变量 $posts 和 $user,我可以使用像 Post::with(['user',[=29= 这样的 eloquests 命令合并这两个变量吗]])'?所以我可以只使用 $posts 变量并像 $posts->users->name 一样使用它来访问用户名。
我正在尝试使用这种方式:
$posts = Post::with(['comments','users'])->findOrFail($id);
但是当我回显 post 它显示用户为 null:
{"id":1,"user_id":1,"title":"Oleh id 1","body":"ini adalah content","created_at":"2017-10-18 03:25:54","updated_at":"2017-10-18 03:25:54","comments":[{"id":1,"post_id":1,"body":"Keren banget deh artikelnya, TOP","created_at":"2017-10-18 03:43:50","updated_at":"2017-10-18 03:43:50"},{"id":2,"post_id":1,"body":"Keren banget deh artikelnya, TOP","created_at":"2017-10-18 03:43:53","updated_at":"2017-10-18 03:43:53"},{"id":3,"post_id":1,"body":"Keren banget deh artikelnya, TOP","created_at":"2017-10-18 03:43:54","updated_at":"2017-10-18 03:43:54"}],"users":null}
如果您需要,这是我的模型。我的 post 模特:
class Post extends Model
{
/**
* Get the comments for the blog post.
*/
public function comments()
{
return $this->hasMany('App\Comment');
}
public function users(){
return $this->belongsTo('App\User');
}
}
我的评论模型
class Comment extends Model
{
/**
* Get the post that owns the comment.
*/
public function post()
{
return $this->belongsTo('App\Post');
}
}
我猜您想要的是用户所有帖子的列表。如果定义了关系,请尝试使用 join
$posts = DB::table('posts')
->join('users', 'users.id', '=', 'posts.user_id')
->select('posts.*', 'users.name as user_name')
->where('posts.comments', '<>', NULL)
->get();
@注意:如果您正在使用 soft deletes
,您可能想添加 where('posts.deleted_at', null)
您将更容易遵守 Laravel 的命名关系约定。
一个Post
有多个Comments
,属于一个User
。鉴于此设置:
class Post extends Model
{
public function comments()
{
return $this->hasMany(Comment::class);
}
}
class Comment extends Model
{
public function post()
{
return $this->belongsTo(Post::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
}
你可以这样查询post的评论和用户:
$comments = $post->comments()->with('user')->get();
如果您总是希望用户返回评论,您也可以在 comments
上预先加载 user
关系:
class Comment extends Model
{
protected $with = ['user'];
public function user()
{
return $this->belongsTo(User::class);
}
}
那么您的查询将得到简化:
$comments = $post->comments;
希望对您有所帮助!!
经过几天的搜索终于得到了答案,我可以像这样合并查询:
$posts = Post::with(['comments','users'])->findOrFail($id);
但在 Post 模型中,函数不是 "Users",而是 "User"。
我有这两个查询来显示 3 个表用户、评论和帖子中的信息。所以我做了这个功能:
public function show($id)
{
$posts = Post::with(['comments'])->findOrFail($id);
$user = User::find($posts->user_id);
echo "<h1>".$posts->title.'</h1>';
echo "<h2>".$user->name.'</h2>';
foreach ($posts->comments as $comment) {
echo $comment->body.'<br>';
}
}
在这个函数上我使用了两个变量 $posts 和 $user,我可以使用像 Post::with(['user',[=29= 这样的 eloquests 命令合并这两个变量吗]])'?所以我可以只使用 $posts 变量并像 $posts->users->name 一样使用它来访问用户名。
我正在尝试使用这种方式:
$posts = Post::with(['comments','users'])->findOrFail($id);
但是当我回显 post 它显示用户为 null:
{"id":1,"user_id":1,"title":"Oleh id 1","body":"ini adalah content","created_at":"2017-10-18 03:25:54","updated_at":"2017-10-18 03:25:54","comments":[{"id":1,"post_id":1,"body":"Keren banget deh artikelnya, TOP","created_at":"2017-10-18 03:43:50","updated_at":"2017-10-18 03:43:50"},{"id":2,"post_id":1,"body":"Keren banget deh artikelnya, TOP","created_at":"2017-10-18 03:43:53","updated_at":"2017-10-18 03:43:53"},{"id":3,"post_id":1,"body":"Keren banget deh artikelnya, TOP","created_at":"2017-10-18 03:43:54","updated_at":"2017-10-18 03:43:54"}],"users":null}
如果您需要,这是我的模型。我的 post 模特:
class Post extends Model
{
/**
* Get the comments for the blog post.
*/
public function comments()
{
return $this->hasMany('App\Comment');
}
public function users(){
return $this->belongsTo('App\User');
}
}
我的评论模型
class Comment extends Model
{
/**
* Get the post that owns the comment.
*/
public function post()
{
return $this->belongsTo('App\Post');
}
}
我猜您想要的是用户所有帖子的列表。如果定义了关系,请尝试使用 join
$posts = DB::table('posts')
->join('users', 'users.id', '=', 'posts.user_id')
->select('posts.*', 'users.name as user_name')
->where('posts.comments', '<>', NULL)
->get();
@注意:如果您正在使用 soft deletes
,您可能想添加 where('posts.deleted_at', null)
您将更容易遵守 Laravel 的命名关系约定。
一个Post
有多个Comments
,属于一个User
。鉴于此设置:
class Post extends Model
{
public function comments()
{
return $this->hasMany(Comment::class);
}
}
class Comment extends Model
{
public function post()
{
return $this->belongsTo(Post::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
}
你可以这样查询post的评论和用户:
$comments = $post->comments()->with('user')->get();
如果您总是希望用户返回评论,您也可以在 comments
上预先加载 user
关系:
class Comment extends Model
{
protected $with = ['user'];
public function user()
{
return $this->belongsTo(User::class);
}
}
那么您的查询将得到简化:
$comments = $post->comments;
希望对您有所帮助!!
经过几天的搜索终于得到了答案,我可以像这样合并查询:
$posts = Post::with(['comments','users'])->findOrFail($id);
但在 Post 模型中,函数不是 "Users",而是 "User"。