Doubler model and migration created

This commit is contained in:
Matt Young 2025-06-22 23:19:38 -05:00
parent cdd0d2bd50
commit d9a7e97047
2 changed files with 92 additions and 3 deletions

View File

@ -2,10 +2,88 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use function PHPUnit\Framework\isInstanceOf;
class Doubler extends Model class Doubler extends Model
{ {
use HasFactory; // Specify that we're not using a single primary key
protected $primaryKey = null;
public $incrementing = false;
protected $guarded = [];
public function student(): BelongsTo
{
return $this->belongsTo(Student::class);
}
public function event(): BelongsTo
{
return $this->belongsTo(Event::class);
}
// Find a doubler based on both keys
public static function findDoubler($studentId, $eventId)
{
return static::where('student_id', $studentId)
->where('event_id', $eventId)
->first();
}
/**
* Sync doubler records for a specified event
*/
public static function syncForEvent($eventId): void
{
if (isInstanceOf(Event::class, $eventId)) {
$eventId = $eventId->id;
}
// Get students with multiple entries in this event's auditions
$studentsWithMultipleEntries = Student::query()
->select('students.id')
->join('entries', 'students.id', '=', 'entries.student_id')
->join('auditions', 'entries.audition_id', '=', 'auditions.id')
->where('auditions.event_id', $eventId)
->groupBy('students.id')
->havingRaw('COUNT(entries.id) > 1')
->get();
foreach ($studentsWithMultipleEntries as $student) {
// Get entries that are not declined. If only one, they're our accepted entry.
$availableEntries = $student->entries()->available()->get();
if ($availableEntries->count() === 1) {
$acceptedEntryId = $availableEntries->first()->id;
} else {
$acceptedEntryId = null;
}
// Create or update the doubler record
static::updateOrCreate(
[
'student_id' => $student->id,
'event_id' => $eventId,
],
[
'accepted_entry' => $acceptedEntryId,
]
);
}
// remove doubler records for students who no longer have multiple entries
static::where('event_id', $eventId)
->whereNotIn('student_id', $studentsWithMultipleEntries->pluck('id'))
->delete();
}
public static function syncDoublers(): void
{
$events = Event::all();
foreach ($events as $event) {
static::syncForEvent($event);
}
}
} }

View File

@ -1,5 +1,7 @@
<?php <?php
use App\Models\Entry;
use App\Models\Student;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
@ -12,7 +14,16 @@ return new class extends Migration
public function up(): void public function up(): void
{ {
Schema::create('doublers', function (Blueprint $table) { Schema::create('doublers', function (Blueprint $table) {
$table->id(); // Foreign keys that will form the composite primary key
$table->foreignIdFor(Student::class)->constrained()->cascadeOnDelete()->cascadeOnUpdate();
$table->foreignIdFor(Event::class)->constrained()->cascadeOnDelete()->cascadeOnUpdate();
// Doubler Specific Fields
$table->integer('entry_count');
$table->foreignIdFor(Entry::class, 'accepted_entry')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate();
// Set the composite primary key
$table->primary(['student_id', 'event_id']);
$table->timestamps(); $table->timestamps();
}); });
} }