Редактирование строк с помощью laravel observe
У меня есть currencies
, мне было предложено использовать метод observe, чтобы установить предыдущий yes
в yes
, когда я добавляю новый yes
Текущие данные
Проблемы
- Проблема с моим наблюдением заключается в том, когда я сохраняю новые данные и устанавливаю
yes
вyes
устанавливается не только стараяyes
кController
но также и новый - Другая проблема заключается в том, что если я сохраняю новую валюту и даже не устанавливаю
yes
, все равно она редактируетyes
другой строки вyes
Результат
Код
Controller
no
Observe
<?php
namespace App\Observers;
use App\Currency;
class CurrencyObserver
{
public function created(Currency $currency)
{
if ($currency->isDirty('default_currency') && $currency->default_currency) {
Currency::where('default_currency', 'yes')->update(['default_currency' => 'no']);
}
return true;
}
public function updated(Currency $currency)
{
if ($currency->isDirty('default_currency') && $currency->default_currency) {
Currency::where('default_currency', 'yes')->update(['default_currency' => 'no']);
}
return true;
}
public function deleted(Currency $currency)
{
//
}
public function restored(Currency $currency)
{
//
}
public function forceDeleted(Currency $currency)
{
//
}
}
Чего я хочу
- Установить старую строку
yes
наpublic function store(Request $request) { $request->validate([ 'name' => 'required|string|unique:currencies', 'symbol' => 'required|unique:currencies', 'position' => 'required', 'decimal_point' => 'required', 'separator_point' => 'required', 'decimals' => 'required', 'default_currency' => 'required', //won't save! ]); $currency = new Currency; $currency->name = $request->input('name'); $currency->symbol = $request->input('symbol'); $currency->position = $request->input('position'); $currency->decimal_point = $request->input('decimal_point'); $currency->separator_point = $request->input('separator_point'); $currency->decimals = $request->input('decimals'); $currency->default_currency = $request->input('default_currency'); $currency->save(); return response()->json([ 'data' => $currency, 'success' => 'Your currency saved successfully.' ]); }
, если новая строка входных данныхyes
какno
иначе просто пусть будетno
Есть идеи, как исправить эту проблему?




Ответы - Редактирование строк с помощью laravel observe / Edit rows with laravel observe

27.01.2020 04:11:15
РЕШЕННЫЙ
Моя проблема была вызвана именованием функций в файле observe. Как вы можете видеть, мой созданный по умолчанию файл поставляется с public function created(Currency $currency)
, которая обновляла мою базу данных после завершения процесса сохранения, поэтому оба мои default_currency
' S будут установлены в no
:)
Я изменил имя своей функции public function saving(Currency $currency)
created
для saving
, поэтому эта функция происходит во время процесса сохранения, а не после него.
Кроме того, чтобы избежать проблем со следующими данными, для которых их default_currency
установлен в no
и не обновляет текущую валюту, я поместил свой код в условие if.
окончательный код
public function saving(Currency $currency)
{
if($currency->default_currency == 'yes'){
if ($currency->isDirty('default_currency') && $currency->default_currency) {
Currency::where('default_currency', 'yes')->update(['default_currency' => 'no']);
}
return true;
}
}
Надеюсь, что это поможет и другим.


27.01.2020 04:11:26
Это должно сработать:
public function creating(Currency $currency)
{
if ($currency->isDirty('default_currency') && $currency->default_currency === 'yes') {
Currency::where('default_currency', 'yes')->update(['default_currency' => 'no']);
}
}
public function updating(Currency $currency)
{
if ($currency->isDirty('default_currency') && $currency->default_currency === 'yes') {
Currency::where('default_currency', 'yes')->update(['default_currency' => 'no']);
}
}
Здесь я изменил updated
и created
на updating
и creating
. Первые два выполняются после обновления/создания строки и с логикой внутри нее устанавливает все валюты по умолчанию = 'no'. Однако если вы сделаете то же самое до установки новой валюты по умолчанию, то запрос не повлияет на новую валюту.
Кроме того, ваша 2-я часть проверки if
( $currency->default_currency
) всегда будет возвращать true, так как yes
, и no
являются истинными значениями, поэтому я изменил это на сравнение строк.