外部キー"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');
}
}
問題点をご指摘いただければ幸いです。
よろしくお願いいたします。