Как обновить существующие данные из БД с помощью внешнего ключа в Laravel 7

#database #laravel #crud

#База данных #laravel #crud

Вопрос:

У меня есть существующие данные из моей базы данных SQL, которые я хочу обновить для продления членства в проекте laravel, который я создаю. Мне нужен внешний ключ user_id , который связывает мою users таблицу с моей money_trades таблицей.

Схема в money_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 коде моей функции в моем контроллере? Любые предложения и помощь будут высоко оценены. Спасибо.

Комментарии:

1. Что вы имеете в виду под «ничего не происходит» ? Вы не получаете перенаправление на ->route('mt.view') ?

2. Нет, страница просто обновляется на той же странице. Когда я пытаюсь выполнить сброс с помощью dd($moneyTrade); перед сохранением, ничего не передается, и страница просто обновляется на той же странице.

3. Привет, Джеми, твоя вторая очередь заключалась в том, почему она создает новую запись вместо обновления текущей. Поскольку для привязки модели вам нужно передать параметр, измените свой маршрут, чтобы Route::patch('/account-renew/{moneyTrade}', 'MoneyTradeController@update')->name('mt.update')->middleware('auth'); надеяться, что он сработал сейчас 🙂

4. вы не передаете идентификатор в URL. убедитесь, что вы делаете что-то вроде {{ route('mt.update', 1//id) }}

5. @Jemy я добавил ответ с проблемой и решением. Проверьте это.

Ответ №1:

Прежде всего, ваша проверка не прошла, и именно поэтому вы были перенаправлены. Теперь вторая проблема — привязка модели маршрута. ваша привязка модели маршрута не работает. Объект привязки является новым, и именно поэтому он сохраняет новую запись в БД. Ваши маршруты

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

Комментарии:

1. Спасибо вам оооочень большое! Вы были очень полезны, и теперь все работает нормально. Теперь я больше понимаю о привязке модели маршрута. Вот почему я создаю новый экземпляр записи, а не обновляю. Еще раз спасибо, и я надеюсь, что вы будете в безопасности! 🙂

Ответ №2:

Возможно, подтвержденное правило для пароля позволяет избежать обновления.

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

Нет поля password_confirmed.

Комментарии:

1. Это сработало, большое спасибо. Однако он сохранил новую запись в базе данных вместо того, чтобы просто обновлять текущие. Должен ли я использовать $moneyTrade->update(); вместо этого?