Thanks to a discussion with jazz_snob, I have made some inroads to understanding Data Access Objects and Data Transfer Objects in my code. I believe they are helping me to avoid writing redundant code over and over again. It also means that I have pretty good separation between my form-handling code and the DBMS that handles the persistence of my data. Pear MDB2 provides another layer of abstraction on top of the dbms.
However, there does not appear to be any place in them for a JOIN between two database tables. Where might these JOINs live? I'm having a bit of trouble picturing where they might go if I am to retain the benefits of these DTOs and DAOs and also continue to have some abstraction between my application and the DBMS.
Any advice would be much appreciated.