首页 > 解决方案 > 使用 laravel 观察编辑行

问题描述

我有currencies一个表,其中只有一个必须设置为default_currency,我被建议使用观察方法以便default_currencyno我添加新的之前设置default_currency

当前数据

一

问题

  1. 我观察的问题是,当我保存新数据并设置 default_currencyyes不仅旧数据设置为新数据default_currencyno
  2. 另一个问题是,如果我保存新货币,甚至没有将default_currency它的值设置为yes仍然编辑default_currency其他行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)
    {
        //
    }
}

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_currencyno,如果新行具有 as 的输入数据,default_currencyyes让旧行为yes

知道如何解决这个问题吗?

标签: phplaravel

解决方案


解决了

我的问题是由观察文件中的函数命名引起的。如您所见,我的默认创建文件public function created(Currency $currency)在保存过程完成后更新我的数据库,因此我default_currency的两个都将设置为no:)

我已将函数名称更改为public function saving(Currency $currency)form createdsaving因此此函数在保存过程中发生,而不是在保存过程之后发生。

另外为了避免他们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;
        }
    }

希望它也能帮助其他人。


推荐阅读