replica410
@replica410 (陽 有村)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Laravelでのデータベース関連のエラーについて

解決したいこと

ここに解決したい内容を記載してください。

Laravelでフリーマーケットサイトを作成している際に、初めて見るデータベース関連のエラーが出て躓いてしまっている為、解決法を教えて欲しいです。
状況としては、自身が出品する商品をフォームにて入力し更新する際にエラーが出てしまっています。

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

SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into `items` (`description`, `updated_at`, `created_at`) values (美味しいみかん, 2022-12-16 18:12:49, 2022-12-16 18:12:49))

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

web.php(ルーティング)
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Auth::routes();
// トップページをログイン画面後に表示させたい場合はmiddlewareを書かないとエラーが出る
Route::get('/', function () {
    return view('layouts.top');
})->middleware('auth');
// お気に入り一覧
Route::resource('likes', 'LikesController')->only([
    'index', 'store', 'destroy'
]);

Route::resource('items', 'ItemsController');

Route::resource('profile', 'ProfileController')->only([
    'store', 'destroy'
]);
Route::get('users/{id}/index', 'ItemsController@index')->name('users.index');


Route::get('/items/{id}/edit_image', 'ItemsController@editImage')->name('items.edit_image');

Route::patch('/items/{id}/edit_image', 'ItemsController@editImage')->name('items.update_image');

Route::get('/profile/{id}/edit', 'ProfileController@edit')->name('profile.edit');
Route::patch('/profile/{id}', 'ProfileController@update')->name('profile.update');
Route::get('/profile/{id}/edit_image', 'ProfileController@editImage')->name('profile.edit_image');
Route::patch('/profile/{id}/edit_image', 'ProfileController@updateImage')->name('profile.update_image');

Route::resource('profile', 'ProfileController')->only([
  'show',
]);


ItemsController.php(コントローラー)
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Item;
use App\User;
use App\category;
use App\Http\Requests\ItemsRequest;
use App\Http\Requests\ItemsImageRequest;
//use App\Http\Requests\ProfileImageRequest;
use App\Services\FileUploadService;

class ItemsController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index()
    {
        $items = Item::where('user_id', \Auth::user()->id)->get();
        return view('users.index',[
            'title' => '出品商品一覧',
            'items' => $items,
        ]);
    }
    
    //新規出品
    public function create()
    {
        return view('items.create',[
        'title' => '商品を出品' 
        ]);
    }

    public function store(ItemsRequest $request, FileUploadService $service)
    {
        // 画像投稿処理
        $path = $this->saveImage($request->file('image'));
        $path= '';
        $image = $request->file('image');
        if(isset($image) === true ){
            // publicディスク(storage/app/public/)のphotosディレクトリに保存
            $path = $image->store('photos', 'public');
        }
        
        Item::create([
            'user' => \Auth::user(),
            //'categories' => Categories::all(),
            'description' => $request->description,
            'image' => $path, //ファイルパスを保存
        ]);
        session()->flash('success', '商品を出品しました');
        return redirect()->route('users.exhibitions');
    }

     // 購入詳細
    public function show($id)
    {
        //
    }

     // 商品情報の編集
    public function edit(Items $items)
    {
        return view('items.edit',[
            'title' => '出品編集',
            'items' => $items,
        ]);
    }

    public function update(Request $request, $id)
    {
        $items = Item::find($id);
        $items->update($request->only(['description']));
        session()->flash('success', '出品しました');
        return redirect()->route('items.index');
    }

    public function destroy($id)
    {
        $items = Item::find($id);
        $items ->delete();
        \Session::flash('success', '商品を削除しました');
        return redirect()->route('items.index');
    }
    
    public function editImage($id)
    {
        $items = Item::find($id);
        return view('items.edit_image',[
            'title' => '画像変更処理',
            'items' => $items, 
        ]);
    }
    
    public function updateImage($id, ItemsImageRequest $request, FileUploadService $service)
        {
          
        //画像投稿処理
        $path = '';
        $image = $request->file('image');
          
        if(isset($image) === true){
              // publicディスク(storage/app/)のphotosディレクトリに保存
        $path = $image->store('photos', 'public');
        }
          
        $items = Item::find($id);
          
          // 変更前の画像の削除
        if($items->image !== ''){
              // publicディスクから、該当の投稿画像($user->image)を削除
              \Storage::disk('public')->delete(\Storage::url($items->image));
        }
          
        $items->update([
            'image' => $path, //ファイル名を保存    
        ]);
          
        session()->flash('success', '画像を変更しました!');
        return redirect()->route('users.index', $id);
        }
      
        private function saveImage($image){
                // 画像投稿処理
        $path = '';
        if(isset($image) === true){
               // publicディスク(storage/app/)のphotosディレクトリに保存
           $path = $image->store('photos', 'public');
        }
            return $path;; // 画像が存在しない場合は空文字
        }

}

create.blade.php(新規出品画面のビュー)
@extends('layouts.top')

@section('title', $title)

@section('content')
  <h1>{{ $title }}</h1>
  <form method="POST" 
  action="{{ action('ItemsController@store') }}"
  enctype="multipart/form-data">
      @csrf
      <div>
          <label>
            商品名:
            <input type="text" name="name">
          </label>
      </div>
      <div>
          <label>
              商品説明:
              <input type="text" name="description">
          </label>
      </div>
      <div>
          <label>
              価格:
              <input type="text" name="price">
          </label>
      </div>
      <div>
          <label>
              カテゴリー:
              <input type="text" name="categories">
          </label>
      </div>
      <div>
        <label>
          画像を選択:
          <input type="file" name="image">
        </label>
      </div>
      <input type="submit" value="出品">
  </form>
@endsection
index.blade.php(商品一覧画面のビュー)
@extends('layouts.top')
 
@section('title', $title)
 
@section('content')
  <h1>{{ $title }}</h1>
  <a href="{{route('items.create')}}">新規出品</a>
  <ul>
      @forelse($items as $item)
      <li class="items">
          <div class="items_content">
            <div class="items_body_heading">
                <div class="items_body_main_img">
                    @if($items->image !== '')
                        <img src="{{ asset('storage/' . $items->image) }}">
                    @else
                        <img src="{{ asset('images/no_image.png') }}">
                    @endif
                </div>
                    <div class="items_body_main_comment">
                        {{ $items->description }}
                    </div>
            </div>
            <div class="items_body_main">
                商品名:{{ $items->name }}
                {{ $items->price }}
            </div>
            <div class="items_category">
                カテゴリ:{{ $items->category_id }}
                ({{ $items->created_at }})
            </div>
            <div class="items_body_footer">
                [<a href="{{ route('items.edit', $items) }}">編集</a>]
                  <form class="delete" method="post" action="{{ route('items.destroy', $items) }}">
                    @csrf
                    @method('DELETE')
                    <input type="submit" value="削除">
            </div>
          </div>
      </li>
      @empty
          <li>出品している商品はありません。</li>
      @endforelse
  </ul>
@endsection
item.php(商品モデル)
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
   protected $fillable = [
    'name', 'description', 'category_id', 'price'
   ];
}

category.php(出品商品のカテゴリーモデル)
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\softDeletes;

class categories extends Model
{
    use SoftDeletes;

    protected $primaryKey = 'category_id';
    protected $fillable = ['name', 'display_order'];
    protected $dates = ['deleted_at', 'created_at', 'updated_at'];

    /**
     * カテゴリリストを取得する
     *
     * @param int    $num_per_page 1ページ当たりの表示件数
     * @param string $order        並び順の基準となるカラム
     * @param string $direction    並び順の向き asc or desc
     * @return mixed
     */
    public function getCategoryList(int $num_per_page = 0, string $order = 'display_order', string $direction = 'asc')
    {
        $query = $this->orderBy($order, $direction);
        if ($num_per_page) {
            return $query->paginate($num_per_page);
        }
        return $query->get();
    }
}

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

0

1Answer

... doesn't have a default value
insert into items (3個) values (3個)

テーブル:items の create table文の
他の列の制約条件,補足設定はどうでしょうか?

description
updated_at
created_at

この3つの列に加え、最低限必要なものがあるのでは?

0Like

Your answer might help someone💌