database->execute( 'INSERT INTO card_movements (card_id, from_column_id, from_column_name, to_column_id, to_column_name, from_swim_lane_id, from_swim_lane_name, to_swim_lane_id, to_swim_lane_name, moved_at, moved_by) VALUES (:card_id, :from_column_id, :from_column_name, :to_column_id, :to_column_name, :from_swim_lane_id, :from_swim_lane_name, :to_swim_lane_id, :to_swim_lane_name, :moved_at, :moved_by)', [ 'card_id' => $movement->cardId, 'from_column_id' => $movement->fromColumnId, 'from_column_name' => $movement->fromColumnName, 'to_column_id' => $movement->toColumnId, 'to_column_name' => $movement->toColumnName, 'from_swim_lane_id' => $movement->fromSwimLaneId, 'from_swim_lane_name' => $movement->fromSwimLaneName, 'to_swim_lane_id' => $movement->toSwimLaneId, 'to_swim_lane_name' => $movement->toSwimLaneName, 'moved_at' => $movement->movedAt, 'moved_by' => $movement->movedBy, ] ); $row = $this->database->first('SELECT last_insert_rowid() AS id'); $movement->id = (int) ($row['id'] ?? 0); return $movement; } /** @return CardMovement[] */ public function findByCardId(int $cardId): array { $rows = $this->database->query( 'SELECT * FROM card_movements WHERE card_id = :card_id ORDER BY moved_at DESC, id DESC', ['card_id' => $cardId] ); return array_map(fn(array $r) => CardMovement::fromRow($r), $rows); } public function deleteByCardId(int $cardId): void { $this->database->execute('DELETE FROM card_movements WHERE card_id = :card_id', ['card_id' => $cardId]); } public function deleteByBoardId(int $boardId): void { $this->database->execute( 'DELETE FROM card_movements WHERE card_id IN (SELECT id FROM cards WHERE board_id = :board_id)', ['board_id' => $boardId] ); } public function deleteByColumnId(int $columnId): void { $this->database->execute( 'DELETE FROM card_movements WHERE card_id IN (SELECT id FROM cards WHERE column_id = :column_id)', ['column_id' => $columnId] ); } public function deleteBySwimLaneId(int $swimLaneId): void { $this->database->execute( 'DELETE FROM card_movements WHERE card_id IN (SELECT id FROM cards WHERE swim_lane_id = :swim_lane_id)', ['swim_lane_id' => $swimLaneId] ); } }