Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

lukeboy_2002's avatar

Events with Attendance

Help, can someone help me. I'm making a ne agenda, event, component. When I create a new event this works. At showing the events my members can add the attendance. But this is not working, there is no entry in my database.

this is a part of the blade file.

and this is my livewire component.

I have asked Junie to help but no result.

0 likes
1 reply
LaryAI's avatar
Level 58

Certainly! Let's break down your issue and provide a solution.

Problem Recap

  • You have a Livewire component for showing an event and letting users update their attendance.
  • The attendance form submits, but no entry is created in the database.

1. Common Issues Checklist

Let's check the most common causes:

a. Model Relationships

Make sure your Agenda model has the correct relationship:

// In App\Models\Agenda.php
public function attendances()
{
    return $this->hasMany(AgendaAttendance::class);
}

And in AgendaAttendance:

// In App\Models\AgendaAttendance.php
public function user()
{
    return $this->belongsTo(User::class);
}

b. Database Table

Ensure your agenda_attendances table exists and has the columns: id, agenda_id, user_id, status, etc.

c. Livewire Form Submission

Your Blade form is correct, but you have both wire:submit.prevent="updateAttendance" on the <form> and wire:click.prevent="updateAttendance" on the button. This can cause double submission or confusion.

Solution:
Remove wire:click.prevent from the button. Only use wire:submit.prevent on the form.

<form wire:submit.prevent="updateAttendance">
    <div class="flex justify-between items-center gap-2 p-2">
        <x-form.select wire:model="attendanceStatus" class="w-full">
            <option value="attending">Attending</option>
            <option value="not_attending">Not Attending</option>
            <option value="maybe">Maybe</option>
        </x-form.select>

        <x-button.default type="submit">
            Update
        </x-button.default>
    </div>
</form>

d. Livewire Property Declaration

Make sure attendanceStatus is a public property:

public $attendanceStatus = 'maybe';

Which you already have.

e. Mass Assignment

Ensure your AgendaAttendance model allows mass assignment for status:

// In App\Models\AgendaAttendance.php
protected $fillable = ['agenda_id', 'user_id', 'status'];

2. Debugging the Livewire Method

Your updateAttendance method looks good. But let's add some debugging to see if it's being called and if validation passes.

public function updateAttendance()
{
    if (! Auth::check()) {
        return redirect()->route('login');
    }

    $this->validate();

    // Debugging: Log the input
    \Log::info('Updating attendance', [
        'agenda_id' => $this->agenda->id,
        'user_id' => Auth::id(),
        'status' => $this->attendanceStatus,
    ]);

    $this->userAttendance = AgendaAttendance::updateOrCreate(
        [
            'agenda_id' => $this->agenda->id,
            'user_id' => Auth::id(),
        ],
        [
            'status' => $this->attendanceStatus,
        ]
    );

    session()->flash('message', 'Attendance status updated!');

    return redirect()->route('agenda.show', $this->agenda);
}

Check your Laravel log (storage/logs/laravel.log) to see if this message appears after submitting the form.


3. Final Checklist

  • Remove wire:click.prevent from the button.
  • Ensure your models and relationships are set up.
  • Check the fillable property on AgendaAttendance.
  • Make sure the database table exists and has the correct columns.
  • Check for validation errors in your browser's dev tools or in the session.

4. Example: Working Setup

Blade:

<form wire:submit.prevent="updateAttendance">
    <x-form.select wire:model="attendanceStatus" class="w-full">
        <option value="attending">Attending</option>
        <option value="not_attending">Not Attending</option>
        <option value="maybe">Maybe</option>
    </x-form.select>
    <x-button.default type="submit">
        Update
    </x-button.default>
</form>

Livewire Component:

public function updateAttendance()
{
    if (! Auth::check()) {
        return redirect()->route('login');
    }

    $this->validate();

    $this->userAttendance = AgendaAttendance::updateOrCreate(
        [
            'agenda_id' => $this->agenda->id,
            'user_id' => Auth::id(),
        ],
        [
            'status' => $this->attendanceStatus,
        ]
    );

    session()->flash('message', 'Attendance status updated!');

    return redirect()->route('agenda.show', $this->agenda);
}

AgendaAttendance Model:

class AgendaAttendance extends Model
{
    protected $fillable = ['agenda_id', 'user_id', 'status'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

5. If Still Not Working

  • Check for JavaScript errors in the browser console (Livewire needs JS to work).
  • Try running php artisan migrate:fresh if your tables might be out of sync.
  • Check your network tab to see if the Livewire request is being sent and if there are any errors in the response.

Summary

  • Remove wire:click.prevent from the button.
  • Ensure relationships and fillable properties are set.
  • Add logging to debug.
  • Make sure your database is correct.

If you follow these steps, your attendance should be saved correctly! If you still have issues, please share any error messages from your logs or browser console.

Please or to participate in this conversation.