【问题标题】:Laravel - foreign key adding an array of data to database and not just idLaravel - 外键向数据库添加数据数组而不仅仅是 id
【发布时间】:2020-06-17 00:43:57
【问题描述】:

我有一张旅行桌和一张打包桌。我创建了两个表之间的关系。

用户可以为他们的旅行创建一个装箱单,添加项目并将它们标记为已完成。

“打包”表的外键是trip_id。 但是,当用户将项目添加到装箱单时,会出现错误 SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect integer value:

似乎trip_id 字段正在添加trips 表中的每个字段。 我只想在下面的示例中添加旅行 ID '17'...

路线

Route::get('/packingList/{id}', 'TaskController@index');
Route::post('/packingList/store', 'TaskController@store')->name('tasks.store');
Route::post('/packingList/update/{id}', 'TaskController@update')->name('tasks.update');
Route::delete('/packingList/{id}', 'TaskController@destroy')->name('tasks.destroy');

packingList.blade.php

<div class="card-body">
    <form method="POST" action="{{route('tasks.store')}}">
      @csrf
      <input value="{{ $trip_id }}" name="trip_id" hidden="true"/>
      <div class="form-group">
        <label for "title">Title</label>
        <input id="title" name="title" type="text" maxlength="225" class="form-control" autocomplete="off" />
      </div>
      <button type="submit" class="btn btn-primary">Create</button>
    </form>
  </div>
<div class="card-header">Items to Pack</div>

  <div class="card-body">
    <table class="table table-striped">
      @foreach ($packings as $packing)
      <tr>
        <td>
          @if($packing->is_complete)
            <s> {{$packing->title}} </s>
          @else
            {{$packing->title}}
          @endif
        </td>
        <td class="text-right">
          @if(! $packing->is_complete)
            <form method="POST" action="{{route('tasks.update', $packing->id)}}">
              @csrf
              <button type="submit" class="btn btn-primary">Complete</button>
            </form>
          @endif
          <form action="{{route('tasks.destroy',[$packing->id])}}" method="POST">
            @method('DELETE')
            @csrf
            <button class="btn btn-danger">Delete</button>
          </form>
        </td>
      </tr>
    @endforeach
  </table>

</div>

控制器

public function index($id) {
    $trip_id = Trip::findOrFail($id);
    $packings = Packing::get();

    return view('packingList')->with('packings', $packings)->with('trip_id', $trip_id);
}

public function store(Request $request) {
  //validate given Request
  $this->validate($request, [
    'title' => 'required|string|max:225',
    'trip_id' => 'required'
  ]);

  //create a new incompletete item with given title
  $packings = new Packing;
  $packings->title = $request->input('title');
  $packings->is_complete = false;
  $packings->trip_id = $request['trip_id'];
  $packings->save();

  return redirect('packingList')->with('success', 'Item added to Packing List');
}

public function update(Request $request, $id) {
  //mark task as complete and save it
  $packings = Packing::find($id);
  $packings->is_complete = true;
  $packings->save();

  return redirect('packingList')->with('success', 'Item  Updated');
}

public function destroy($id)
{
  $packings = Packing::find($id);
  $packings->delete();
  return redirect('trips')->with('success', 'Item Deleted from Packing List');
}

模型

public function trip()
{
    return $this->belongsTo('App\Trip', 'trip_id');
}

public function packings() {
  return $this->hasMany('App\Packing');
}

【问题讨论】:

    标签: php laravel foreign-keys


    【解决方案1】:

    修改你的控制器:

    public function store(Request $request) {
      //validate given Request
      $this->validate($request, [
        'title' => 'required|string|max:225',
        'trip_id' => 'required|numeric' //we want it to be number
      ]);
    
      //create a new incompletete item with given title
      $packings = new Packing;
      $packings->title = $request->input('title');
      $packings->is_complete = false;
      $packings->trip_id = $request['trip_id'];
      $packings->save();
    
      return redirect('packingList')->with('success', 'Item added to Packing List');
    }
    

    【讨论】:

    • 我收到消息“行程 ID 必须是数字。”
    • 这就是插入在数据库级别失败的原因。 DB 期望 trip_id 是一个数字,而不是字符串。现在我们已经添加了一个验证检查,我们正在捕捉它。我猜您将行程 ID 作为字符串 '17' 而不是 17 发送。这是你可以做的。修改:$packings-&gt;trip_id = (int) $request['trip_id']; //cast to number
    • 嗯,我似乎仍然收到相同的消息“旅行 ID 必须是数字。”
    • 删除数字验证:'trip_id' =&gt; 'required' So validation passes, our casting here $packings->trip_id = (int) $request['trip_id'];` 将在保存前转换为整数。
    猜你喜欢
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多