Como faço para escrever classs de object efetivamente ao lidar com juntas de tabela?

Devo começar por dizer que não estou agora, nem tenho delírios, jamais serei um programador profissional, então a maioria das minhas habilidades foram aprendidas da experiência como um passatempo.

Aprendi o PHP, pois pareceu uma boa introdução simples em certas áreas e me permitiu projetar aplicativos web simples.

Quando eu aprendi sobre objects, classs, etc, os exames básicos do tutor abrangiam a idéia de que, como regra geral, cada tabela de database deveria ter sua própria class. Embora isso tenha funcionado bem para o projeto de galeria de fotos que escrevemos, já que ele tinha consultas mysql muito simples, não está funcionando tão bem agora, meus projetos estão ficando mais complexos. Se eu exigir dados de duas tabelas separadas que exigem uma associação na tabela, em vez disso, ignorei completamente a class e manipulá-la caso a caso, OU, pior ainda foi combinando alguns dos dados na class e o resto como um entidade separada e fazendo duas consultas, o que para mim parece ineficiente.

Como exemplo, ao exibir conteúdo em um fórum que escrevi, se você visualizar um segmento, eu recupere dados da tabela de tópicos, a tabela de posts e a tabela de usuários. As consultas da tabela de usuários e postagens são recuperadas por meio de uma junit e não instanciadas como um object, enquanto os dados de thread são chamados usando minha class de Threads.

Então, como faço da minha situação atual a algo um pouco menos estúpido, por falta de uma palavra melhor. Agora eu tenho uma class de database que lida com valores de conexão e escape etc, uma class de consulta db principal que lida com as consultas e methods comuns, e todas as outras classs (Thread, Upload, Session, Photo e aqueles que não são Post usado, Usuário, etc.) são filhos disso.

Eu faço uma grande postagem class que tem os atributos extras relevantes que eu recupero da tabela de usuários (e potencialmente threads)?
Eu tenho classs separadas que preenchem cada um de seus atributos relevantes com uma única consulta? Em caso afirmativo, como faço isso?
Por causa da forma como minhas aulas são escritas, com base no que foi ensinado, o meu método de linha de atualização de db, ou o método de inserção, apenas aceitam os atributos como uma matriz e atualizam tudo isso, se eu tiver atributos extras de outras tabelas db em cada class, então, como eu reescreva esses methods como uma atualização obviamente automática, como isso, resultaria em erros?

Em suma, acho que a minha compreensão está limitada agora e gostaria de algumas dicas quando se trata dos fundamentos de como escrever classs mais complexas.

Editar:

Obrigado pelas respostas até agora, me deram muitos pointers e pensamentos e muitos materiais de leitura. O que eu gostaria, porém, é talvez uma idéia de como pessoas diferentes decidiram lidar com uma tabela simples juntar-se a qualquer quantidade de aulas? Você adicionou atributos às aulas? Consulta de fora da class, em seguida, passar os resultados em cada class? Algo mais?

Livros inteiros foram escritos sobre como criar um conjunto de classs para se adequar a um esquema de database.

Longa história curta: não existe uma maneira única de fazê-lo, você precisa tomar muitas decisões de design sobre os compromissos que você deseja fazer, por aplicativo.

Você pode encontrar uma biblioteca ou estrutura para ajudar, palavras-chave: ActiveRecord, ORM (Object Relational Mapper)

PS Você não faz ideia do potencial para a paralisia da análise da morte de almas e sobre o projeto em que pode entrar. Faça a coisa mais simples que pode funcionar para o seu aplicativo.

Exemplo de código para o meu comentário (abaixo):

$post = new PublishedPost($data); $edit = $post->setTitle($newTitle); $edit->save(); 

Isso é muito amplo para ser respondido sem entrar em um comprimento épico.

Basicamente, existem quatro proeminentes padrões arquitetônicos de origem de dados de padrões de arquitetura corporativa : Gateway de dados de tabela , Gateway de dados de linha , Registro ativo e Mapeador de dados . Estes podem ser encontrados implementados nos frameworks php comuns em alguma variação. Estes são fáceis de entender e implementar.

Onde fica difícil é quando você começa a enfrentar a incompatibilidade de impedância entre o database e os objects de negócios em sua aplicação. Para fazer isso, existem vários Padrões de Relacionamento Objeto-Relacional, Estrutural e Metadata, como Mapas de Identidade, Carregamento Preguiçoso, Objetos de Consulta, Repositórios, etc. Explicando isso está além do escopo. Eles cobrem quase 200 páginas no PoEAA.

O que você pode observar é Doctrine ou Propel – os dois mais bem conhecidos ORM do PHP – que implementam a maioria desses padrões e que você poderia usar em seu aplicativo para replace o seu gerenciamento de access atual ao database.

Muitas das suas preocupações podem ser respondidas através da inspeção das soluções existentes encontradas em frameworks bem testados, como CakePHP , Symfony e Zend Framework . Examinar suas abordagens e espreitar sob o capuz deve esclarecer suas perguntas. Quem sabe? Você pode mesmo decidir escrever projetos futuros usando-os!

Eles passaram anos colocando suas cabeças juntas para enfrentar esses problemas. Aproveitar-se!

Checkout Doctrine:

Aqui está um exemplo de um aplicativo de fórum usando Doutrina.

http://www.doctrine-project.org/documentation/manual/1_2/en/real-world-examples#forum-application