如何刷新/重置模型,使其再次成为新模型

时间:2019-03-20 12:58:37

标签: laravel

我的服务:

protected $review;
public function __construct(Review $review){
   $this->review = review;
}

public function addReview(){
   $this->review->text = "nice";
   $this->review->save();
}

我的控制器:

protected $reviewService;
public function __construct(ReviewService $review){
  $this->reviewService = $review;
}


public function review(){
 $this->reviewService->addReview();
 $this->reviewService->addReview();

}

发生什么事,我两次调用addReview。但是我希望$ this-> review在第二次调用时变得全新。如果执行上述代码,则只会插入一个条目。我希望它插入两次。

方法1)

public function addReview(){
   $this->review->text = "nice";
   $this->review->save();
   $this->review = new Review(); //I don't want to do that
}

但是我不想在函数中使用'new'。

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

我认为您过分关心新操作员。似乎您应该在这里使用new运算符,因为您要创建一个新的评论。但是,您不应使用class属性。

public function addReview() {
   $review = new Review();
   $review->text = "nice";
   $review->save();
   // ... whatever you need to do with this new $review, return it? add it to a collection?
}

我想避免使用new的原因是您可以模拟Review类,而这正是Eloquent模型所引起的困惑。确实应该没有必要模拟实体。在这里使用new Review没问题,问题在于$review->save()命中数据库。另一种选择是将持久化实体的关注点移至存储库类并模拟存储库。

答案 1 :(得分:0)

您要在这里实现什么?

new Review()将创建审阅模型的新实例,但尚未将其持久化到数据库中。

是否要创建一个全新的模型以保存在数据库中?如果是,请使用Review :: create()。

-> refresh()将再次从数据库中检索调用该模型的信息。该信息可能已经从您应用程序中的其他位置更改了。

答案 2 :(得分:0)

所以类似的事情可能会起作用:

public function addReview(){
    $this->review = Review::create();
    $this->review->text = "nice";
    $this->review->save();
}