#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. Хорошо, я думаю, я знаю, о чем вы просите сейчас. Смотрите обновление.