Pergunta

Eu tenho uma estrutura de modelo: categoria Hasmany Produto Hasmany StockItem pertencem o armazém, fabricante.

Eu busco dados com este código, usando o Conteraable para poder filtrar mais profundamente os modelos associados:

$this->Category->find('all', array(
        'conditions' => array('Category.id' => $category_id),
        'contain' => array(
            'Product' => array(
                'Stockitem' => array(
                    'conditions' => array('Stockitem.warehouse_id' => $warehouse_id),
                    'Warehouse',
                    'Manufacturer',
                )
            )
        ),
        )
    );

A estrutura de dados é retornada muito bem, no entanto, recebo várias consultas repetidas como, às vezes centenas dessas consultas seguidas, com base no conjunto de dados.

SELECT `Warehouse`.`id`, `Warehouse`.`title` FROM `beta_warehouses` AS `Warehouse` WHERE `Warehouse`.`id` = 2

Basicamente, ao criar o bolo da estrutura de dados, está buscando dados do MySQL repetidamente, para cada linha. Temos conjuntos de dados de vários milhares de linhas e sinto que isso afetará o desempenho. É possível fazer os resultados do cache e não repetir as mesmas consultas?

Foi útil?

Solução

Experimente isso:

$this->Product->find('all', array(
    'conditions' => array('Category.id' => $category_id, 'Stockitem.warehouse_id' => $warehouse_id),
    'contain' => array(
        'Category'
        , 'Stockitem' => array(
            'Warehouse'
            , 'Manufacturer'
        )
    ),
));

Se você remover o armazém e o fabricante, encontrará que o CakePHP execute apenas uma consulta.

Como alternativa, você pode criar visualizações de banco de dados para consultas complexas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top