雄辩注入多个模型关系

时间:2018-06-17 11:08:09

标签: laravel eloquent laravel-5.6

所以我在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。

2 个答案:

答案 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])
);