isMysql()) { $this->execute('ALTER TABLE api_tokens ADD COLUMN user_id INT UNSIGNED NULL'); $this->execute( 'ALTER TABLE api_tokens ADD CONSTRAINT fk_api_tokens_user ' . 'FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE' ); $this->execute('CREATE INDEX idx_api_tokens_user_id ON api_tokens(user_id)'); return; } // SQLite cannot add a FOREIGN KEY via ALTER TABLE. Adding the column // alone gives us the storage; FK enforcement at insert/update is // handled at the application layer (TokensController validates the // acting user exists). Index still useful for issuer-lookup queries. $this->execute('ALTER TABLE api_tokens ADD COLUMN user_id INTEGER NULL'); $this->execute('CREATE INDEX idx_api_tokens_user_id ON api_tokens(user_id)'); } public function down(): void { if ($this->isMysql()) { $this->execute('ALTER TABLE api_tokens DROP FOREIGN KEY fk_api_tokens_user'); $this->execute('DROP INDEX idx_api_tokens_user_id ON api_tokens'); $this->execute('ALTER TABLE api_tokens DROP COLUMN user_id'); return; } $this->execute('DROP INDEX IF EXISTS idx_api_tokens_user_id'); $this->execute('ALTER TABLE api_tokens DROP COLUMN user_id'); } }