Редактировать строки с помощью laravel наблюдать - PullRequest
0 голосов
/ 27 января 2020

У меня есть currencies таблица, где только один из них должен быть установлен как default_currency, мне предложили использовать метод наблюдения, чтобы установить предыдущий default_currency в no, когда я добавлю новый default_currency

Текущие данные

one

Проблемы

  1. Проблема с моим наблюдением заключается в том, когда я сохраняю новый данные и установите default_currency в yes не только старый default_currency будет установлен в no, но и новый
  2. Другой вопрос, если я сохраняю новую валюту и даже не устанавливаю default_currency ее значение в yes все еще редактируется default_currency другой строки в no

Результат

two

Код

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)
    {
        //
    }
}

Controller

 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.'
        ]);
    }

Что я хочу

  1. Установить старую строку default_currency в no, если новая строка имеет входные данные default_currency как yes в противном случае просто оставьте старую yes

Есть идеи, как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 27 января 2020

Это должно работать:

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. Первые два выполнения после строки были обновлены / созданы, и с логикой c внутри нее для всех валют установлено значение по умолчанию = 'no'. Однако, если вы сделаете то же самое до того, как будет установлена ​​новая валюта по умолчанию, запрос не повлияет на новую валюту.

Кроме того, ваша вторая часть проверки if ($currency->default_currency) всегда будет верните true, так как yes и no являются истинными значениями, поэтому я изменил это на сравнение строк.

1 голос
/ 27 января 2020

решено

Моя проблема была вызвана именованием функций в файле наблюдения. Как вы можете видеть, мой созданный по умолчанию файл шел с public function created(Currency $currency), который обновлял мою базу данных после завершения процесса сохранения, поэтому оба моих default_currency были бы установлены на no:)

У меня есть изменил имя моей функции на public function saving(Currency $currency) форма created на saving, поэтому эта функция происходит во время процесса сохранения, а не после него.

Также, чтобы избежать проблем со следующими данными, для которых default_currency установлено no и не обновляя текущую валюту, я поместил свой код внутри, если условие.

окончательный код

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;
        }
    }

Надеюсь, это поможет и другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...