Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

SQLSTATE[HY000]: General error: 1364 Field 'number' doesn't have a default value

Esou recebendo esse erro e não consigo identificar qual a relação do campo com o insert, to perdido alguém pra dar um help?

SQLSTATE[HY000]: General error: 1364 Field 'number' doesn't have a default value INSERT INTO seasons (updated_at, created_at) VALUES (2024 -05 -08 20: 38: 18, 2024 -05 -08 20: 38: 18)

Model:

  <?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Seasons extends Model
{
    use HasFactory;
    protected $fillable = ['number'];

    public function series()
    {
        return $this->belongsTo(Series::class);
    }

    public function episodes(): HasMany
    {
        return $this->hasMany(Episode::class);
    }

Migration

  return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('seasons', function (Blueprint $table) {
            $table->id();
            $table->unsignedTinyInteger('number');
            $table->foreignId('series_id')->constrained()->onDelete('cascade');
            $table->timestamps();
        });
    }

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

O erro ocorre no update da EpisodesController

class EpisodesController
{

    public function index(Seasons $seasons)
    {
        return view('episodes.index', ['episodes' => $seasons->episodes]);
    }

    public function update(Request $request, Seasons $seasons)
    {
        $watchedEpisodes = $request->episode;
        $seasons->episodes()->each(function (Episode $episode) use ($watchedEpisodes)
        {
            $episode->watched = in_array($episode->id, $watchedEpisodes);
        });

        $seasons->push();

        return to_route('episodes.index', $seasons->id);

    }

}
2 respostas
solução!

Oii, Guilherme! Tudo bem?

Segundo o erro que você nos trouxe, campo number na tabela seasons está tentando ser inserido sem um valor, o que está causando o problema, já que esse campo não tem um valor padrão definido e não permite NULL.

Você está no caminho certo, no modelo Seasons, você especificou que o campo number é preenchível (fillable). Agora é preciso garantir que este campo esteja sendo devidamente atribuído antes de tentar salvar ou atualizar o objeto no banco de dados.

Uma sugestão é modificar o método update para incluir o valor do campo number antes de chamar o método push(). E também verifique se no formulário ou na chamada API que está fazendo o update, o campo number está sendo incluído. Se não estiver, você precisará ajustar isso para garantir que o campo não tente ser inserido sem valor.

Espero que as sugestões te ajude a resolver.

Bons estudos, Guilherme!

Eu estava coom problemas em receber e tratar o objeto Seasons, coloquei da minha maneira em um input escondido o season_id (que é a unica coisa que preciso no update), com isso peguei parte do codigo de alguns colegas aqui do Forum para alterar os episodios com uma unica query, adicionei um metodo para tratar também caso o formulario esteja vazio. Segue a implementação:

    public function update(Request $request)
    {
        $season_id = $request->season;

        if (!is_array($request->episode)){
            DB::table('episode')->where('seasons_id', $season_id)->update(['watched' => '0']);
            return to_route('episode.index', $season_id);
        }

        $watchedEpisodes = implode(', ', $request->episode ?? []);

        DB::transaction(function () use ($watchedEpisodes, $season_id) {
            DB::table('episode')->where('seasons_id', $season_id)
                ->update(['watched' => DB::raw("case when id in ($watchedEpisodes) then 1 else 0 end")]);
        });


        return to_route('episode.index', $season_id);

    }

Segue o fomulario que vieram os dados:

    <form method="post">
        @csrf
        <ul class="list-group">
            @foreach ($episode as $episodes)
                <li class="list-group-item d-flex justify-content-between align-items-center">
                    Episódio {{ $episodes->number }}
                    <input type="checkbox"
                           name="episode[]"
                           value="{{ $episodes->id }}"
                           @if($episodes->watched) checked @endif
                    />
                </li>
            @endforeach
                <input type="hidden"
                       name="season[]"
                       value="{{ $episodes->seasons_id }}"
                />
        </ul>
        <button type="submit" class="btn btn-primary mt-2 mb-2">Salvar</button>
    </form>
</x-layout>