2016-10-07 59 views
0

這裏再次,我有一個問題。我正在開發一個約3600條記錄的實體的應用程序,當我顯示index.html.twig這是一個產品列表需要很長的時間,約20秒顯示引導表。如何在symfony2中執行樹枝結果?

我的實體:

<?php 

namespace Nival\InventarioBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* InProducto 
* 
* @ORM\Table(name="in_producto") 
* @ORM\Entity 
*/ 
class InProducto 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="InProveedorProducto", mappedBy="InProducto", cascade={"persist"}) 
    */ 
    protected $producto; 
/** 
* @ORM\OneToMany(targetEntity="InOrdenCompraDetalle", mappedBy="InProducto", cascade={"persist"}) 
*/ 
protected $productoOc; 

public function __construct() 
{ 
    $this->producto = new ArrayCollection(); 
    $this->productoOc = new ArrayCollection(); 
} 

public function __toString() { 
    return $this->nombre; 
} 

/** 
* @ORM\ManyToOne(targetEntity="InSubLinea", inversedBy="InProducto") 
* @ORM\JoinColumn(name="id_sub_linea", referencedColumnName="id") 
*/ 
protected $subLinea; 

/** 
* @ORM\ManyToOne(targetEntity="InUnidadMedida", inversedBy="InProducto") 
* @ORM\JoinColumn(name="id_unidad_medida", referencedColumnName="id") 
*/ 
protected $unidadMedida; 

public function getDisplayName() 
{ 
    return sprintf('%s (%s)', $this->nombre, $this->unidadMedida); 
} 

/** 
* @var integer 
* 
* @ORM\Column(name="id_producto", type="integer", nullable=false) 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
private $idProducto; 

/** 
* @var string 
* 
* @ORM\Column(name="nombre", type="string", length=100, nullable=false) 
*/ 
private $nombre; 

/** 
* @var string 
* 
* @ORM\Column(name="descripcion", type="string", length=100, nullable=true) 
*/ 
private $descripcion; 

/** 
* @var integer 
* 
* @ORM\Column(name="id_unidad_medida", type="integer", nullable=false) 
*/ 
private $idUnidadMedida; 

/** 
* @var string 
* 
* @ORM\Column(name="costo_promedio", type="decimal", precision=9, scale=6, nullable=false) 
*/ 
private $costoPromedio; 

/** 
* @var integer 
* 
* @ORM\Column(name="id_sub_linea", type="integer", nullable=false) 
*/ 
private $idSubLinea; 

/** 
* @var integer 
* 
* @ORM\Column(name="id_tipo_producto", type="integer", nullable=false) 
*/ 
private $idTipoProducto; 

/** 
* @var \DateTime 
* 
* @ORM\Column(name="fecha_ingreso", type="date", nullable=false) 
*/ 
private $fechaIngreso; 

/** 
* @var string 
* 
* @ORM\Column(name="precio1", type="decimal", precision=9, scale=2, nullable=false) 
*/ 
private $precio1; 

/** 
* @var string 
* 
* @ORM\Column(name="precio2", type="decimal", precision=9, scale=2, nullable=false) 
*/ 
private $precio2; 

/** 
* @var string 
* 
* @ORM\Column(name="precio3", type="decimal", precision=9, scale=2, nullable=false) 
*/ 
private $precio3; 

/** 
* @var boolean 
* 
* @ORM\Column(name="inventariable", type="boolean", nullable=false) 
*/ 
private $inventariable; 

/** 
* @var boolean 
* 
* @ORM\Column(name="facturable", type="boolean", nullable=false) 
*/ 
private $facturable; 

/** 
* @var boolean 
* 
* @ORM\Column(name="activo", type="boolean", nullable=false) 
*/ 
private $activo; 

/** 
* @var integer 
* 
* @ORM\Column(name="id_empresaa", type="integer", nullable=false) 
*/ 
private $idEmpresaa; 

/** 
* Get idProducto 
* 
* @return integer 
*/ 
public function getIdProducto() 
{ 
    return $this->idProducto; 
} 

/** 
* Set nombre 
* 
* @param string $nombre 
* @return InProducto 
*/ 
public function setNombre($nombre) 
{ 
    $this->nombre = $nombre; 

    return $this; 
} 

/** 
* Get nombre 
* 
* @return string 
*/ 
public function getNombre() 
{ 
    return $this->nombre; 
} 

/** 
* Set descripcion 
* 
* @param string $descripcion 
* @return InProducto 
*/ 
public function setDescripcion($descripcion) 
{ 
    $this->descripcion = $descripcion; 

    return $this; 
} 

/** 
* Get descripcion 
* 
* @return string 
*/ 
public function getDescripcion() 
{ 
    return $this->descripcion; 
} 

/** 
* Set idUnidadMedida 
* 
* @param integer $idUnidadMedida 
* @return InProducto 
*/ 
public function setIdUnidadMedida($idUnidadMedida) 
{ 
    $this->idUnidadMedida = $idUnidadMedida; 

    return $this; 
} 

/** 
* Get idUnidadMedida 
* 
* @return integer 
*/ 
public function getIdUnidadMedida() 
{ 
    return $this->idUnidadMedida; 
} 

/** 
* Set costoPromedio 
* 
* @param string $costoPromedio 
* @return InProducto 
*/ 
public function setCostoPromedio($costoPromedio) 
{ 
    $this->costoPromedio = $costoPromedio; 

    return $this; 
} 

/** 
* Get costoPromedio 
* 
* @return string 
*/ 
public function getCostoPromedio() 
{ 
    return $this->costoPromedio; 
} 

/** 
* Set idSubLinea 
* 
* @param integer $idSubLinea 
* @return InProducto 
*/ 
public function setIdSubLinea($idSubLinea) 
{ 
    $this->idSubLinea = $idSubLinea; 

    return $this; 
} 

/** 
* Get idSubLinea 
* 
* @return integer 
*/ 
public function getIdSubLinea() 
{ 
    return $this->idSubLinea; 
} 

/** 
* Set idTipoProducto 
* 
* @param integer $idTipoProducto 
* @return InProducto 
*/ 
public function setIdTipoProducto($idTipoProducto) 
{ 
    $this->idTipoProducto = $idTipoProducto; 

    return $this; 
} 

/** 
* Get idTipoProducto 
* 
* @return integer 
*/ 
public function getIdTipoProducto() 
{ 
    return $this->idTipoProducto; 
} 

/** 
* Set fechaIngreso 
* 
* @param \DateTime $fechaIngreso 
* @return InProducto 
*/ 
public function setFechaIngreso($fechaIngreso) 
{ 
    $this->fechaIngreso = $fechaIngreso; 

    return $this; 
} 

/** 
* Get fechaIngreso 
* 
* @return \DateTime 
*/ 
public function getFechaIngreso() 
{ 
    return $this->fechaIngreso; 
} 

/** 
* Set precio1 
* 
* @param string $precio1 
* @return InProducto 
*/ 
public function setPrecio1($precio1) 
{ 
    $this->precio1 = $precio1; 

    return $this; 
} 

/** 
* Get precio1 
* 
* @return string 
*/ 
public function getPrecio1() 
{ 
    return $this->precio1; 
} 

/** 
* Set precio2 
* 
* @param string $precio2 
* @return InProducto 
*/ 
public function setPrecio2($precio2) 
{ 
    $this->precio2 = $precio2; 

    return $this; 
} 

/** 
* Get precio2 
* 
* @return string 
*/ 
public function getPrecio2() 
{ 
    return $this->precio2; 
} 

/** 
* Set precio3 
* 
* @param string $precio3 
* @return InProducto 
*/ 
public function setPrecio3($precio3) 
{ 
    $this->precio3 = $precio3; 

    return $this; 
} 

/** 
* Get precio3 
* 
* @return string 
*/ 
public function getPrecio3() 
{ 
    return $this->precio3; 
} 

/** 
* Set inventariable 
* 
* @param boolean $inventariable 
* @return InProducto 
*/ 
public function setInventariable($inventariable) 
{ 
    $this->inventariable = $inventariable; 

    return $this; 
} 

/** 
* Get inventariable 
* 
* @return boolean 
*/ 
public function getInventariable() 
{ 
    return $this->inventariable; 
} 

/** 
* Set facturable 
* 
* @param boolean $facturable 
* @return InProducto 
*/ 
public function setFacturable($facturable) 
{ 
    $this->facturable = $facturable; 

    return $this; 
} 

/** 
* Get facturable 
* 
* @return boolean 
*/ 
public function getFacturable() 
{ 
    return $this->facturable; 
} 

/** 
* Set activo 
* 
* @param boolean $activo 
* @return InProducto 
*/ 
public function setActivo($activo) 
{ 
    $this->activo = $activo; 

    return $this; 
} 

/** 
* Get activo 
* 
* @return boolean 
*/ 
public function getActivo() 
{ 
    return $this->activo; 
} 

public function setUnidadMedida($unidadMedida) 
{ 
    $this->unidadMedida = $unidadMedida; 

    return $this; 
} 

/** 
* Get unidadMedida 
* 
* @return integer 
*/ 
public function getUnidadMedida() 
{ 
    return $this->unidadMedida; 
} 

public function setSubLinea($subLinea) 
{ 
    $this->subLinea = $subLinea; 

    return $this; 
} 

/** 
* Get subLinea 
* 
* @return integer 
*/ 
public function getSubLinea() 
{ 
    return $this->subLinea; 
} 

public function setProducto($producto) 
{ 
    $this->producto = $producto; 

    return $this; 
} 

/** 
* Get producto 
* 
* @return integer 
*/ 
public function getProducto() 
{ 
    return $this->producto; 
} 

public function setProductoOc($productoOc) 
{ 
    $this->productoOc = $productoOc; 

    return $this; 
} 

/** 
* Get productoOc 
* 
* @return integer 
*/ 
public function getProductoOc() 
{ 
    return $this->productoOc; 
} 

/** 
* Set idEmpresaa 
* 
* @param integer $idEmpresaa 
* @return InProducto 
*/ 
public function setIdEmpresaa($idEmpresaa) 
{ 
    $this->idEmpresaa = $idEmpresaa; 

    return $this; 
} 

/** 
* Get idEmpresaa 
* 
* @return integer 
*/ 
public function getIdEmpresaa() 
{ 
    return $this->idEmpresaa; 
} 
} 

我的控制器:

public function indexAction() 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $session = $this->get('session'); 
    $id_empresaa = $session->get('idempresa'); 

    $entities = $em->getRepository('NivalInventarioBundle:InProducto')->findBy(array(
     'idEmpresaa' => $id_empresaa 
    )); 

    return $this->render('NivalInventarioBundle:InProducto:index.html.twig', array(
     'entities' => $entities, 
    )); 
} 

我的樹枝:

{% extends 'NivalInventarioBundle:Default:index.html.twig' %} 

{% block content %} 
    {% block inventario_menu %} 
     {{ parent() }} 
    {% endblock %} 
    <h3>Productos</h3> 
    <div class="row" style = margin-bottom:55px;"> 
     <div class="col-md-12"> 
      <table id="ftable" class="table table-striped table-bordered" cellspacing="0" width="100%"> 
       <thead> 
       <tr> 
        <th>Código</th> 
        <th>Nombre</th> 
        <th>Unidad</th> 
        <th>Costo</th> 
        <th>Sub-Linea</th> 
        <th>Linea</th> 
        <th>Invent.</th> 
        <th>Factura</th> 
        <th>Activo</th> 
        <th>Opción</th> 
       </tr> 
       </thead> 
       <tbody> 
       {% for entity in entities %} 
        <tr> 
         <td>{{ entity.idProducto }}</td> 
         <td>{{ entity.nombre }}</td> 
         <td>{{ entity.unidadMedida.nombre }}</td> 
         <td class="text-right">{{ entity.costoPromedio|number_format(4) }}</td> 
         <td>{{ entity.subLinea.nombre }}</td> 
         <td>{{ entity.subLinea.linea.nombre }}</td> 
         <td> 
          {% if entity.inventariable == 0 %} 
           No 
          {% elseif entity.inventariable == 1 %} 
           Sí 
          {% endif %} 
         </td> 
         <td> 
          {% if entity.facturable == 0 %} 
           No 
          {% elseif entity.facturable == 1 %} 
           Sí 
          {% endif %} 
         </td> 
         <td> 
          {% if entity.activo == 0 %} 
           No 
          {% elseif entity.activo == 1 %} 
           Sí 
          {% endif %} 
         </td> 
         <td class = "actions"> 
          <a href="{{ path('inproducto_show', { 'id': entity.idProducto }) }}" 
           class = "btn btn-sm btn-info glyphicon glyphicon-search" data-toggle="tooltip" title="Ver"></a> 
          {% if app.user.nivel > 60 %} 
           <a href="{{ path('inproducto_edit', { 'id': entity.idProducto }) }}" 
            class = "btn btn-sm btn-primary glyphicon glyphicon-edit" data-toggle="tooltip" title="Editar"></a> 
          {% endif %} 
         </td> 
        </tr> 
       {% endfor %} 
       </tbody> 
      </table> 
     </div> 
     {% if app.user.nivel > 30 %} 
      <div class="col-md-12"> 
       <a href="{{ path('inproducto_new') }}" 
        class = "btn btn-success glyphicon glyphicon-plus" data-toggle="tooltip" title="Nuevo"></a> 
      </div> 
     {% endif %} 
    </div> 
{% endblock %} 

我一直在尋找互聯網上,但不能找到一個解決方案。

我在VPS安裝APC,並設置config_prod.yml

doctrine: 
orm: 
    auto_mapping: true 
    metadata_cache_driver: apc 
    result_cache_driver: apc 
    query_cache_driver: apc 

monolog: 
    handlers: 
     main: 
      type:   fingers_crossed 
      action_level: error 
      handler:  nested 
     nested: 
      type: stream 
      path: "%kernel.logs_dir%/%kernel.environment%.log" 
      level: debug 
     console: 
      type: console 

請給我一個線索!

回答

0
  1. 設置eager取消協subLineaunidadMedida模式。

使用此提取模式,DB中的所有數據將在一個請求中檢索。

/** 
* @ORM\ManyToOne(targetEntity="InSubLinea", inversedBy="InProducto", fetch="EAGER") 
* @ORM\JoinColumn(name="id_sub_linea", referencedColumnName="id") 
*/ 
protected $subLinea; 

/** 
* @ORM\ManyToOne(targetEntity="InUnidadMedida", inversedBy="InProducto", fetch="EAGER") 
* @ORM\JoinColumn(name="id_unidad_medida", referencedColumnName="id") 
*/ 
protected $unidadMedida; 
  • 安裝樹枝C擴展
    http://twig.sensiolabs.org/doc/installation.html#installing-the-c-extension
  • +0

    嗨,最大,謝謝你,我添加fetch關係,但我不能看到加載產品列表中的任何變化,也有我的樹枝版本1.18,我讀的是C ext自帶1.4或更高。 –

    +0

    此外,即使閱讀文檔,我也不清楚教義的緩存設置。 –

    +0

    清除元數據緩存'./bin/console doctrine:cache:clear-metadata' –