@kokikoki800

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

外部キー"user_id"をDBに保存したい。

解決したいこと

外部キー"user_id"をDB(MySQL)に保存したい。

Laravelで音楽プレイヤーを作成しています。
ログイン機能と楽曲追加フォームを作り、曲を追加する際はログインしているユーザーと紐付けたいです。
テーブルはuser、musicとし、musicテーブルに外部キー"user_id"を持たせています。
コントローラではUserモデルから"user_id"を取ってきてビューに送っています。

発生している問題・エラー

ファイルをアップロードしようとすると、以下のエラーが出てしまいます。

SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '{"id":1}' for column 'user_id' at row 1

dd($request->all())と入れたところ、"user_id" => "{"id":1}"とあり、値は入っていました。

ルーティング

//楽曲追加画面表示
Route::get('/upload',[UploadController::class,'add']);

//楽曲追加
Route::post('/upload',[UploadController::class,'create']);

コントローラ

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\UploadRequest;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use App\Models\Music;

class UploadController extends Controller
{ 
  public function add(){
      $user_name = Auth::user()->name ;
      $user_id = User::where('name',$user_name)->first('id') ;
      $param = [
            'user_id' => $user_id,
      ];
      return view('upload',$param);
  }
  public function create(UploadRequest $request){   
      $form = $request->all();
      Music::create($form);
      return redirect('/upload');
  }
}

入力フォーム

<body>
  
  <div class="form">
    <div>
      <p class="add">楽曲追加</p>
    </div>
    <form action="/upload" method="post" enctype="multipart/form-data">
    @csrf
    <input type="hidden" name="user_id" value={{$user_id}}>
    <div>
      <input type="text"  name="title" placeholder="楽曲" value="{{old('title')}}">
      @error('title')
      <p class="message">{{$message}}</p>
      @enderror
    </div>
    <div>
      <input type="text"  name="artist" placeholder="アーティスト" value="{{old('artist')}}">
      @error('artist')
      <p class="message">{{$message}}</p>
      @enderror
    </div>
    <div>
      <input type="file" name="file"required>
    </div>
    <div>
      @error('file')
      <p class="message">{{$message}}</p>
      @enderror
    </div>
    <div>
      <button>アップロード</button>
    </div>
    </form>
  </div>

</body>

Musicモデル

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Music extends Model
{
    protected $guarded = [
        'id',
    ];
    protected $fillable = [
        'user_id',
        'title',
        'artist',
        'file',
    ];
    public static $rules = [
        'user_id' => 'required',
        'title' => 'required',
        'artist' => 'required',
        'file' => 'required',
    ];
    public function getTitle(){
        return $this->title . ' / ' . $this->artist;
    }
    public function user(){
     return $this->belongsTo('App\Models\User');
    }
}

musicテーブル

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMusicTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('music', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id');
            $table->string('title');
            $table->string('artist');
            $table->binary('file');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('music');
    }
}

問題点をご指摘いただければ幸いです。
よろしくお願いいたします。

0 likes

3Answer

SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '{"id":1}' for column 'user_id' at row 1

このエラーメッセージはSQLサーバーから返されたものです。ということは、やっぱり変な値を入れようとしていると思われます。

dd($request->all())と入れたところ、"user_id" => "{"id":1}"と表示されます。
これではいけないのでしょうか?

HTTPの仕組みを考えてみてください。ファイルをアップロードするとき、「クライアント側」から戻ってくる値は、テンプレートでHTMLに埋め込まれた値です。

なので、まずは、クライアント側でHTMLのソースを見て、inputタグにちゃんとuser_idが入っているか確かめてみた方がいいかも。たぶん value="1"じゃなくてvalue={"id":1}とかって、変なふうに値が入っていませんか??

※一応、Webアプリを作るのなら、HTTPがどのように通信しているのか、くらいは把握しておいた方がいいかもしれません…。

<追記>

もしかしたらと思って、他の原因も追記したのですが、多分違うと思います。混乱させたならごめんなさい。

なんか、phpのコードなんて見るの久しぶりなのですが、つい口を出してしまいました(知っているフレームワークですらない…)。人のコードのデバッグってなんでこんなに楽しいのでしょう…。性格悪いですね…自重。

0Like
$user_id = User::where('name',$user_name)->first('id') ;
↓
$user_id = User::where('name',$user_name)->first()->id ;

てやったらどうなりますか?

0Like

Auth::user()->name; でログインユーザー名が取れているので
Auth::user()->id; でログインユーザーid が取れませんか?

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\UploadRequest;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use App\Models\Music;

class UploadController extends Controller
{ 
  public function add(){
      $user_name = Auth::user()->name ;
      $user_id = Auth::user()->id ;
      // $user_id = User::where('name',$user_name)->first('id') ;

      $param = [
            'user_id' => $user_id,
      ];
      return view('upload',$param);
  }
  public function create(UploadRequest $request){   
      $form = $request->all();
      Music::create($form);
      return redirect('/upload');
  }
}
0Like

Your answer might help someone💌