#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();
вместо этого?