Laravel控制器create函数无法完整存数据:gift_card_id字段缺失
问题
尝试将code属性与gift_card_id一同存入codes数据表,但仅code字段成功保存,gift_card_id始终缺失。故障细节:
- 调用
dd($giftCard)时返回GiftCard模型类本身而非实例,调用dd($giftCard->id)返回null; - 为
generateCodes方法添加$id参数后,dd($id)可获取正确ID,但修改create语句指定gift_card_id为$id后,该字段仍无法存入。
相关代码
web.php
Route::post('gift-cards/{giftcard}/add-codes', 'GiftCardController@generateCodes')->name('gift-cards.generateCodes');
GiftCardController.php
public function generateCodes(Request $request, GiftCard $giftCard) { $request->validate([ 'amount' => 'required|integer|min:1', ]); if ($request->input('amount') > 0) { do { $codes = []; for ($i = 0; $i < $request->input('amount'); $i++) { $codes[] = (string)mt_rand(pow(10, 10), pow(10, 11) - 1); } $codesUnique = Code::whereIn('code', $codes)->count() == 0; } while (!$codesUnique); foreach ($codes as $code) { // dd($id); $giftCard->codes()->create(['code' => $code]); } } }
View.blade.php
@foreach($giftCards as $key => $giftcard) <tr data-entry-id="{{ $giftcard->id }}"> <td> {{ $giftcard->name ?? '' }} </td> <td> {{ $giftcard->price ?? '' }} </td> <td> {{ $giftcard->codes_count ?? '' }} </td> @can('gift_card_create') <td> <form action="{{route('gift-cards.generateCodes', $giftcard->id)}}" method="POST"> @csrf <input type="number" class="form-control" name="amount" placeholder="Amount" required> <input type="submit" class="btn btn-xs btn-success ml-2" value="Generate"> </form> </td> @endcan </tr> @endforeach
解决方案
修正路由参数与模型绑定的名称匹配问题
Laravel隐式模型绑定要求路由参数名和控制器注入的模型变量名大小写完全一致。当前路由参数是{giftcard}(全小写),但控制器方法中变量是$giftCard(驼峰式),导致无法正确实例化GiftCard模型,$giftCard实际是模型类而非实例,自然无法获取id。修复控制器方法参数名,与路由参数保持一致:
public function generateCodes(Request $request, GiftCard $giftcard) { $request->validate([ 'amount' => 'required|integer|min:1', ]); if ($request->input('amount') > 0) { do { $codes = []; for ($i = 0; $i < $request->input('amount'); $i++) { $codes[] = (string)mt_rand(pow(10, 10), pow(10, 11) - 1); } $codesUnique = Code::whereIn('code', $codes)->count() == 0; } while (!$codesUnique); foreach ($codes as $code) { $giftcard->codes()->create(['code' => $code]); } } }确认Code模型的批量赋值白名单
使用create()方法批量赋值时,只有$fillable数组中的字段会被允许写入。若Code模型未将gift_card_id加入$fillable,即使关联正确也无法存入该字段。检查并修改Code模型:
class Code extends Model { protected $fillable = ['code', 'gift_card_id']; // 确保包含gift_card_id }验证关联关系定义正确性
确保GiftCard模型中已正确定义与Code的一对多关联:class GiftCard extends Model { public function codes() { return $this->hasMany(Code::class); // 外键默认匹配gift_card_id,无需额外指定 } }
内容的提问来源于stack exchange,提问作者Hagar Maher
相关产品推荐
相关产品推荐

