简体   繁体   English

如何将 $request 从表单存储到 laravel 中的数据透视表

[英]How to store $request from form to Pivot table in laravel

I am trying to store data from a form to a pivot table asset_user.我正在尝试将数据从表单存储到数据透视表asset_user。

Model User:模型用户:

public function assets()
{
    return $this->belongsToMany(Asset::class)->withPivot(['amount']);
}

Model Asset模型资产

public function users()
{
    return $this->belongsToMany(User::class)->withPivot(['amount']);
}

Migration asset_user:迁移资产_用户:

public function up()
{
    Schema::create('asset_user', function (Blueprint $table) {
        $table->foreignId('asset_id')->unsigned()->index();
        $table->foreignId('user_id')->unsigned()->index();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->foreign('asset_id')->references('id')->on('assets');
        $table->primary(['user_id', 'asset_id']);
        $table->decimal('amount');
        $table->timestamps();
    });
}

My POST form:我的 POST 表单:

<div id="form" class="form">
    <form action="{{ route('home.store') }}" method="POST" novalidate>
      @csrf
        <label for="asset_id">Add Asset</label>
        <select class="form-control" id="asset_id" name="asset_id">
        @foreach($assets as $asset)
          <option value="{{$asset->id}}">{{$asset->symbol}} {{$asset->name}}</option>
          @endforeach
        </select>
      </div>
          @error('asset_id')
            <div style="color:red;">{{ $message }}</div>
          @enderror
        </div>
        <div class="form-group mb-4">
          <label for="amount">Amount</label>
          <input type="number" class="form-control" id="amount" name="amount" value=''></input>
          @error('amount')
            <div style="color:red;">{{ $message }}</div>
          @enderror
        </div>
        <input type="hidden" name="user_id" value="{{ Auth::user()->id }}">
        <button type="submit" class="btn btn-dark">speichern</button>
        </form>
</div>

Controller:控制器:

public function store(Request $request){

    $validAsset= $this->validate($request,[
        'amount' => 'required|numeric',
        'asset_id' => 'required',
        'user_id' => 'required'
    ]);
    // dd($validAsset);
    $user = User::findOrFail(1);
    $user->assets()->attach($validAsset, [
        'amount'=> $validAsset['amount'],
        'asset_id'=> $validAsset['asset_id'],
        'user_id' => $validAsset['user_id']
    ]);

With my try above i get the error:通过上面的尝试,我得到了错误:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '5-3' for key 'PRIMARY SQLSTATE [23000]:违反完整性约束:1062 键 'PRIMARY 的重复条目 '5-3'

insert into `asset_user` (`amount`, `asset_id`, `user_id`) values (7, 3, 5), (7, 3, 5), (7, 3, 5)

Why does it try to store all 3 values to all 3 columns?为什么它尝试将所有 3 个值存储到所有 3 列? Thanks!谢谢!

您可以使用同步方法而不是像这样附加:

$user->assets()->sync($request->asset_id[], ['amount'=> $request->amount]);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM