Eovaldi (5-3) allowed just six hits and a walk to help steady the Marlins, who had lost four of five. Four Miami relievers preserved the shutout with 2 2/3 no-hit innings.
Casey McGehee and Derek Dietrich each went 2-for-5, with McGehee providing the early fireworks with a two-run double in the top of the first to give Eovaldi an early lead to work with. Dietrich and Reed Johnson drove in the other runs.
Roberto Hernandez (3-6) struck out six in six innings of work for Philadelphia, allowing two runs on three hits. The highlight of Hernandez's night was his first career hit, a single to right in his first at-bat.
Cody Asche had three of the six Phillies hits.
Jake Marisnick led off the game by grounding out, but Dietrich singled and Giancarlo Stanton was plunked to put two on for McGehee, who crushed a two- bagger off the wall in right-center.
McGehee nearly helped Miami pad its cushion his next time up. With Stanton on second and one out, he sent a liner to center, but Ben Revere made a diving catch to rob him of extra bases. Stanton was doubled off second for the inning-ending double-play and Revere's first outfield assist of the season.
Hernandez, fired up after the terrific defensive play behind him, stepped to the plate to lead off the bottom of the third and slapped a single the opposite way to right. He had been 0-for-40 at the dish in his career. The Phillies starter was stranded, however, as Jimmy Rollins flied out and Carlos Ruiz grounded into a 5-4-3 double-play.
Ruiz grounded into a second double-play to end the eighth inning.
The Phillies also fell apart in the ninth inning, committing two errors after going the previous 10 games without one. The Marlins, who entered on a nine- game errorless streak, now own the MLB's longest stretch of clean baseball at 10 games.
Chase Utley and pitcher Antonio Bastardo made errors, putting runners on the corners for the pinch-hitter Johnson, who blooped an RBI single to left. Two batters later, Dietrich laced an RBI base knock to right for a 4-0 lead.