id(); $table->foreignId('user_id')->constrained()->cascadeOnDelete(); $table->string('token', 64)->unique(); $table->string('recipient_email')->nullable(); $table->text('password')->nullable(); $table->dateTime('expires_at'); $table->dateTime('revoked_at')->nullable(); $table->unsignedInteger('access_count')->default(0); $table->dateTime('last_accessed_at')->nullable(); $table->timestamps(); $table->index(['user_id', 'expires_at']); }); Schema::create('certificate_share', function (Blueprint $table) { $table->id(); $table->foreignId('certificate_id')->constrained()->cascadeOnDelete(); $table->foreignId('share_id')->constrained()->cascadeOnDelete(); $table->unique(['certificate_id', 'share_id']); }); } public function down(): void { Schema::dropIfExists('certificate_share'); Schema::dropIfExists('shares'); } };