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

Database 如何使用Laravel 7中的外键更新数据库中的现有数据,database,laravel,crud,Database,Laravel,Crud,我有我的SQL数据库中的现有数据,我想更新这些数据以更新我正在创建的laravel项目中的成员资格。我需要一个外键user\u id,它将我的users表链接到我的money\u trades表 money\u trades表中的架构 Schema::create('money_trades', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('mt_n

我有我的SQL数据库中的现有数据,我想更新这些数据以更新我正在创建的laravel项目中的成员资格。我需要一个外键
user\u id
,它将我的
users
表链接到我的
money\u trades

money\u trades
表中的架构

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([
...
“密码”=>[“必需”、“字符串”、“最小值:8”、“已确认”],
...
]);    

没有密码确认字段。

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

$request->validate([
...
“密码”=>[“必需”、“字符串”、“最小值:8”、“已确认”],
...
]);    

没有密码确认字段。

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

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

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

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

“什么都没发生”是什么意思?您没有重定向到
->route('mt.view')
?没有,页面只是在同一页面上刷新。当我尝试使用
dd($moneyTrade)转储时保存之前,没有传递任何内容,页面也会在同一个页面上刷新。嗨,杰米,你的第二个问题是,为什么它会创建新记录而不是更新当前记录。因为,对于模型绑定,您需要传递参数,将路由更改为
route::patch('/account renew/{moneyTrade}','MoneyTradeController@update')->name('mt.update')->中间件('auth')希望它现在能工作:)您没有在url中传递id。请确保您正在执行类似于
{route('mt.update',1//id)}
@Jemy的操作。我已经添加了问题和解决方案的答案。看看这个,你说“什么都没发生”是什么意思?您没有重定向到
->route('mt.view')
?没有,页面只是在同一页面上刷新。当我尝试使用
dd($moneyTrade)转储时保存之前,没有传递任何内容,页面也会在同一个页面上刷新。嗨,杰米,你的第二个问题是,为什么它会创建新记录而不是更新当前记录。因为,对于模型绑定,您需要传递参数,将路由更改为
route::patch('/account renew/{moneyTrade}','MoneyTradeController@update')->name('mt.update')->中间件('auth')希望它现在能工作:)您没有在url中传递id。请确保您正在执行类似于
{route('mt.update',1//id)}
@Jemy的操作。我已经添加了问题和解决方案的答案。看看这个,很有效,非常感谢。然而,它在数据库中保存了一条新记录,而不是仅仅更新当前记录。我应该使用
$moneyTrade->update()吗取而代之?这很有效,非常感谢。然而,它在数据库中保存了一条新记录,而不是仅仅更新当前记录。我应该使用
$moneyTrade->update()吗取而代之?非常感谢!你帮了大忙,现在一切正常。现在我进一步了解了路由模型绑定。这就是为什么我要创建一个新的记录实例,而不是更新。再次感谢你,我希望你安全非常感谢你!你帮了大忙,现在一切正常。现在我进一步了解了路由模型绑定。这就是为什么我要创建一个新的记录实例,而不是更新。再次感谢你,我希望你安全