как обновить / сбросить модель, чтобы она снова стала новой

#laravel

#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’ в функции.

Есть предложения?

Комментарии:

1. В чем смысл проверки, передаваемой через конструктор?

2. Можете ли вы просто добавить в свою, ReviewService скажем refreshReview() , функцию, которая вызывает $this->review = new Review() , и вызвать ее перед второй addReview() ? Кроме того, почему вы не хотите использовать new Review() ? Я не совсем понимаю, что вы пытаетесь здесь сделать.

Ответ №1:

Чего вы пытаетесь здесь достичь?

новая проверка () создаст новый экземпляр модели проверки, но еще не сохранит его в базе данных.

Вы хотите создать совершенно новую модель для сохранения в базе данных? Если да, используйте Review::create().

-> refresh() снова получит информацию из базы данных для модели, на которой она вызывается. эта информация могла быть изменена из какого-либо другого места в вашем приложении.

Ответ №2:

Я думаю, вы чрезмерно обеспокоены новым оператором. Похоже, вам следует использовать здесь оператор 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() попадании в базу данных. Альтернативой является перенос заботы о сохранении сущности в класс репозитория и издевательство над репозиторием.

Ответ №3:

Итак, что-то вроде этого может сработать:

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

Комментарии:

1. все еще не работает.. в БД сохраняется только одна запись.

2. Хорошо, я думаю, я знаю, о чем вы просите сейчас. Смотрите обновление.