Редактирование строк с помощью laravel observe

Редактирование строк с помощью laravel observe

27.01.2020 03:50:24 Просмотров 30 Источник

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

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

one

Проблемы

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

Результат

two

Код

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

Чего я хочу

  1. Установить старую строку 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

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

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59924143/edit-rows-with-laravel-observe#comment105971268_59924143
@ceejayoz это был вопрос именования функций :)

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

Является ответом!
mafortis

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

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

https://stackoverflow.com/questions/59924143/edit-rows-with-laravel-observe/59924252#comment105971596_59924252
Удалить строку возврата. Метод наблюдателя должен возвращать void.
DevK

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являются истинными значениями, поэтому я изменил это на сравнение строк.

https://stackoverflow.com/questions/59924143/edit-rows-with-laravel-observe/59924253#comment105971305_59924253
именно, я только что поделился похожим решением, как и вы :)
https://stackoverflow.com/questions/59924143/edit-rows-with-laravel-observe/59924253#comment105971313_59924253
Да, только что видел. saving()действительно лучше, так как вам не нужен дубликат кода!
Закрыть X