Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal estou com o seguinte problema, eu tenho duas tabelas, produtos e produtos_imagens.
Na página onde apresento os produtos são apresentados 5 produtos por vez, e cada um dos produtos tem várias imagens.
Basicamente o que preciso fazer é chamar:
produto01
img01
img02
img03
...
produto02
img01
img02
e assim sucessivamente..
A questão é que usando o join eu consigo retornar todos os produtos mas só me retornam uma imagem por produto, segue abaixo como fiz o join:
$select = $db->select()
->from(array('p' => 'produtos'))
->join(array('i' => 'produtos_imagens'), 'i.IdProduto = p.Id', array('Id', 'Thumb', 'Imagem'))
->where("p.Destaque = 1 AND p.IdCategoria = {$categoria}")
->group('p.Id');
Então eu peço como posso fazer para relacionar essas tabelas de uma forma correta e que me retorne o numero total de imagem.
Desde já agradeço a atenção.
>
O problema é que você está agrupando os produtos pelo ID, então ele só vai retornar apenas uma linha por produto mesmo.
Mas se eu não agrupo da forma que fiz acima, ele repete o produto pelo total de imagens.
Se tiver 5 imagens, o produto é repetido 5 vezes!
Mas pra você pegar todos os registros de imagens de cada produto tem que ser assim mesmo, se não em vez de fazer o INNER JOIN faça uma consulta simples pra retornar os produtos e daí em cada produto você faz uma consulta adicional pra resgatar as imagens dele.
>
Mas pra você pegar todos os registros de imagens de cada produto tem que ser assim mesmo, se não em vez de fazer o INNER JOIN faça uma consulta simples pra retornar os produtos e daí em cada produto você faz uma consulta adicional pra resgatar as imagens dele.
Eu tava pensando nisso, mas pesquisei aqui e não encontrei como fazer isso usando o Zend. Porque a consulta é montada dentro do controller correto? então como vou passar o ID de cada produto para consulta das imagens e depois retornar isso pra view?
Se pude me dar uma luz eu fico grato.
Então, vai depender de como você costuma montar a estrutura da sua aplicação.
Eu vou dar um exemplo de como eu costumo trabalhar com o ZF, esta forma de trabalhar eu peguei de alguns tutoriais criados pelo próprio Matthew Weier O'Phinney, o líder de desenvolvimento do ZF. Mas eu já vi muita gente trabalhando de formas diferentes.
Primeiro eu criaria duas entidades, uma para representar o produto e outra para representar cada imagem de um produto:
/application/model/Product.php
/application/model/ProductImage.php
Criaria dois data tables, uma para cada tabela no banco de dados:
/application/model/DbTable/Products.php
/application/model/DbTable/ProductsImages.php
E por fim um data mapper, que seria responsável por fazer a ligação entre os dados no banco de dados (retornados pelo data table) e as entidades.
/application/model/ProductMapper.php
Agora na classe Application_Model_ProductMapper você cria um método fetchHighlights, pois notei que você pretende buscar apenas os produtos em destaque. Ficaria mais ou menos assim:
class Application_Model_ProductMapper
{
protected $_dbTable;
public function setDbTable($dbTable) {
if (is_string($dbTable)) {
$dbTable = new $dbTable();
}
if (!$dbTable instanceof Zend_Db_Table_Abstract) {
throw new Exception('Invalid table data gateway provided');
}
$this->_dbTable = $dbTable;
return $this;
}
public function getDbTable() {
if (null === $this->_dbTable) {
$this->setDbTable('Application_Model_DbTable_Products');
}
return $this->_dbTable;
}
public function fetchHighlights() {
// busca os produtos em destaque
$resultSet = $this->getDbTable()->fetchAll($this->getDbTable()->select()->where('destaque = 1'));
// um array para armazenar os objetos de cada produto
$products = array();
// percorre cada linha de produto retornada na consulta
foreach ($resultSet as $row) {
// um array para armazenar os objetos de cada imagem
$images = array();
// busca as imagens referentes a este produto
$dbTableProductsImages = new Application_Model_DbTable_ProductsImages();
$resultSet = $this->getDbTable()->fetchAll($dbTableProductsImages->select()->where('product_id = ?', $row->id));
foreach ($resultSet as $rowImage) {
$image = new Application_Model_ProductImage();
$image->setId($rowImage->id);
$image->setFilename($rowImage->filename);
// adiciona a imagem ao array
$images[] = $image;
}
// cria um objeto da entidade produto
$product = new Application_Model_Product();
$product->setId($row->id);
$product->setName($row->name);
$product->setPrice($row->price);
$product->setImages($images); // aqui adicionamos as imagens ao objeto produto
$products[] = $product;
}
// retorna o array contendo os objetos de cada produto
return $products;
}
Eu fiz o codigo rápido aqui só pra demonstrar como eu faria e não cheguei a testar. Deixei ele comentado pra ficar mais fácil de entender. Qualquer dúvida posta aí. ;)
Léo, muito obrigado pela força.
Estou engatinhando no ZF ainda, então vou dar uma boa estudada no que você me passou para começar a aplicar em meus projetos.
Caso tenha alguma referência para estudo que possa estar utilizando eu ficaria grato.
E quando eu conseguir aplicar o que me passou aqui, volto para postar o resultado..
Bom, mais uma vez, obrigado pela ajuda!
Abraço
Então Francis, eu sugiro que você crie o projeto de exemplo disponível no Quick Start do ZF, dá uma olhada :seta: http://framework.zend.com/manual/en/learning.quickstart.html
O projeto é bem simples, trata-se de um guestbook (livro de visitas), e montando ele você vai entender qual é o papel de cada coisa em sua aplicação.
O exemplo que eu dei usando data mapper você encontra na parte de Model e Data Table :seta: http://framework.zend.com/manual/en/learning.quickstart.create-model.html
Um abraço!
Leozitho, muito obrigado pela ajuda e pelas dicas.
Consegui resolver meu problema com os toques que me deu, agora vou me aprofundar mais no uso dos models do ZF! :lol:
Bom, mais uma vez obrigado.
Abrass
O problema é que você está agrupando os produtos pelo ID, então ele só vai retornar apenas uma linha por produto mesmo.