所以我在JeffreyWay的截屏视频中了解到,我可以使用Eloquent从注入另一个模型的模型中获取相关的id。
我正在关注他关于Laravel 5.4的系列文章。
在这里,我有一对多的用户与帖子的关系。
应用/后
public function user()
{
return $this->belongsTo(User::class);
}
在我的用户模型中,我有一个发布方法,其中注入了Post Model。 publish方法用于在数据库中创建一个post条目。
应用/用户
public function posts()
{
return $this->hasMany(Post::class);
}
public function publish(Post $post)
{
$this->posts()->save($post);
}
然后我在PostsController中有一个store方法,它调用我的User Model中的publish方法。
PostsController
class PostsController extends Controller
{
public function __construct()
{
$this->middleware('auth')->except(['index', 'show']);
}
public function store()
{
auth()->user()->publish(
new Post(request(['title', 'body']))
);
}
}
调用publish方法时,注入的Post类会自动将user_id设置为save方法。
我的问题是,在每个帖子都有评论的情况下,如何建立这样的关系。这些注释与发布评论的帖子和用户相关联。
简而言之,当我调用addComment方法时,我应该同时拥有user_id和post_id。
答案 0 :(得分:0)
用户模型:
public function posts(){
return $this->hasMany(Post::class);
}
public function comments(){
return $this->hasMany(Comments::class);
}
帖子模型
public function user(){
return $this->belongsTo(User::class);
}
public function comments(){
return $this->hasMany(Comments::class);
}
评论模型
public function post(){
return $this->belongsTo(Post::class);
}
public function user(){
return $this->belongsTo(User::class);
}
示例问题:
1)获取用户评论:
解决方案:auth() - > user() - > comments() - > get(); < - 用户的集合 评论。
2)从给定的评论中获取用户:
解决方案:Comment :: find($ someCommentId) - > user() - > first() - > name; < - 来自特定评论的用户名。
3)获取特定帖子的所有评论。
解决方案:Post :: first() - > comments() - > get();或eager load ::后用( '意见') - >首先(); < - 包含帖子的集合 其中的信息你可以找到一组评论 交。
4)加载评论时加载用户:
解决方案:Comment :: with('user') - > first(); < - 单一集合 包含一个包含用户信息和评论信息的集合。
5)同时为该帖子加载特定的用户帖子和评论:
解决方案:User :: with('posts.comments') - > first(); < - 包含一个 带有用户信息的集合以及每个用户帖子的集合 包含评论的帖子。
答案 1 :(得分:0)
在你的问题中你写道:
简而言之,当我调用addComment方法时,我应该同时拥有user_id和post_id。
哪个绝对没问题。您不必通过$user->posts()->save($post)
之类的方法设置这些属性 - 这只是一种为您完成工作的便捷方法(请参阅框架代码中的save($model)
和相关setForeignAttributesForCreate($model)
;这些方法只为你设置了外键属性。
事实上,以下三种创建新帖子的方式是可以互换的:
// what you did
$user->posts->save(
new Post([
'title' => 'Hello',
'body' => 'World!',
])
);
// equivalent
Post::create([
'user_id' => \Auth::user()->id, // or \Auth::id()
'title' => 'Hello',
'body' => 'World!',
]);
// also equivalent
$post = new Post([
'user_id' => \Auth::user()->id, // or \Auth::id()
'title' => 'Hello',
'body' => 'World!',
]);
$post->save();
当存储新评论时,您很可能会有这样的控制器,因为评论总是属于帖子,因此您需要该帖子的参考:
class CommentsController extends Controller
{
public function __construct()
{
$this->middleware('auth')->except(['index', 'show']);
}
public function store(Post $post)
{
$comment = new Comment(request(['body']));
$comment->user_id = \Auth::user()->id;
$comment->post_id = $post->id;
$comment->save();
}
}
您也可以缩写并写下:
Comment::create(
array_merge(request(['body']), ['user_id' => \Auth::id(), 'post_id' => $post->id])
);