如何使用 Laravel 7 中的外键从数据库更新现有数据

How To Update Existing Data from DB with a Foreign Key in Laravel 7

我有来自我的 SQL 数据库的现有数据,我想更新这些数据以更新我正在创建的 laravel 项目中的成员资格。我想要一个外键 user_id 将我的 users table 链接到我的 money_trades table.

money_trades 中的架构 table

Schema::create('money_trades', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('mt_number');
        $table->unsignedBigInteger('user_id');

        $table->string('bank');
        $table->string('email');
        $table->string('mt_first_name');
        $table->string('mt_last_name');
        $table->string('password');
        $table->string('mt_account');
        $table->integer('mt_deposit');
        $table->integer('mt_renewFee');
        $table->string('mt_leverage');
        $table->string('expiry_date');

        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

        $table->timestamps();
    });

MoneyTradeController.php store

public function store(Request $request)
{

    $request->validate([
        'bank' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255'],
        'mt_first_name' => ['required', 'string', 'max:255'],
        'mt_last_name' => ['required', 'string', 'max:255'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
        'mt_account' => ['required', 'string', 'max:255'],
        'mt_deposit' => ['required', 'integer', 'max:1000000', 'min:500'],
        'mt_renewFee' => ['required', 'integer', 'max:1000000'],
        'mt_leverage' => ['required', 'string', 'max:255'],
        'expiry_date' => ['required', 'string', 'max:255'],


    ]);

    $moneyTrade = new MoneyTrade();
   
    $moneyTrade->mt_number = uniqid('MTNumber-');

    $moneyTrade->bank = $request->input('bank');
    $moneyTrade->email = $request->input('email');
    $moneyTrade->mt_first_name = $request->input('mt_first_name');
    $moneyTrade->mt_last_name = $request->input('mt_last_name');
    $moneyTrade->password = $request->input('password');
    $moneyTrade->mt_account = $request->input('mt_account');
    $moneyTrade->mt_deposit = $request->input('mt_deposit');
    $moneyTrade->mt_renewFee = $request->input('mt_renewFee');
    $moneyTrade->mt_leverage = $request->input('mt_leverage');
    $moneyTrade->expiry_date = $request->input('expiry_date');

    $moneyTrade->user_id = auth()->id();
   
    $moneyTrade->save();


    //send mail
    Mail::to($moneyTrade->user->email)->send(new MoneyTradeMail($moneyTrade));

    return redirect()->route('mt.view')->withMessage('MoneyTrade Account Created');
}

    }

MoneyTradeController.php update

public function update(Request $request, MoneyTrade $moneyTrade)
{
    dd($request);
    $request->validate([
        'bank' => ['required', 'string', 'max:255'],
        'mt_number' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255'],
        'mt_first_name' => ['required', 'string', 'max:255'],
        'mt_last_name' => ['required', 'string', 'max:255'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
        'mt_account' => ['required', 'string', 'max:255'],
        'mt_deposit' => ['required', 'integer', 'max:1000000', 'min:500'],
        'mt_renewFee' => ['required', 'integer', 'max:1000000'],
        'mt_leverage' => ['required', 'string', 'max:255'],
        'expiry_date' => ['required', 'string', 'max:255'],


    ]);

    $moneyTrade->bank = $request->input('bank');
    $moneyTrade->mt_number = $request->input('mt_number');
    $moneyTrade->email = $request->input('email');
    $moneyTrade->mt_first_name = $request->input('mt_first_name');
    $moneyTrade->mt_last_name = $request->input('mt_last_name');
    $moneyTrade->password = $request->input('password');
    $moneyTrade->mt_account = $request->input('mt_account');
    $moneyTrade->mt_deposit = $request->input('mt_deposit');
    $moneyTrade->mt_renewFee = $request->input('mt_renewFee');
    $moneyTrade->mt_leverage = $request->input('mt_leverage');
    $moneyTrade->expiry_date = $request->input('expiry_date');

    $moneyTrade->user_id = auth()->id();

    $moneyTrade->save();

    return redirect()->route('mt.view')->withMessage('MoneyTrade Account Renewed');
}

当我转储 dd($request) 我得到这些

web.php

中相关的路线
Route::resource('moneytrade', 'MoneyTradeController')->middleware('auth');
Route::patch('/account-renew', 'MoneyTradeController@update')->name('mt.update')->middleware('auth');
Route::get('/trading-account', 'MoneyTradeController@view')->name('mt.view')->middleware('auth');
Route::get('/renew', 'MoneyTradeController@renew')->name('mt.renew')->middleware('auth');

当我尝试更新时没有任何反应,但我没有遇到任何错误。我在控制器中的 update 功能代码中缺少什么?任何建议和帮助将不胜感激。谢谢。

可能是密码确认规则在避免更新。

$request->validate([
   ...
   'password' => ['required', 'string', 'min:8', 'confirmed'],
   ...
]);    

没有 password_confirmed 字段。

首先,您的验证没有通过,这就是您被重定向的原因。现在第二个问题是路由模型绑定。您的路由模型绑定不起作用。绑定对象是新的,这就是它在数据库中保存新条目的原因。您的路线是

Route::resource('moneytrade', 'MoneyTradeController')->middleware('auth');
Route::patch('/account-renew/{moneytrade}', 'MoneyTradeController@update')->name('mt.update')->middleware('auth'); 

看看你的 uri moneytrade 是 moneytrade 但在你的控制器中你将对象绑定为 moneyTrade 其中 T 是资本。在路由模型绑定中,Laravel 期望 uri 段和绑定对象相同。否则模型绑定将不起作用。如果您 dd 您的 $moneyTrade 对象,您会发现它是空的。所以这里的解决方案是更改 url 或控制器对象。 如果你改变路线,他们会像

Route::resource('money-trade', 'MoneyTradeController')->middleware('auth');
or
Route::resource('moneyTrade', 'MoneyTradeController')->middleware('auth');
Route::patch('/account-renew/{moneyTrade}', 'MoneyTradeController@update')->name('mt.update')->middleware('auth');

而且您不必更改控制器代码。如果你想改变控制器而不是路线那么你的控制器将是

public function update(Request $request, MoneyTrade $moneytrade)
{
    dd($moneytrade);
}