如何在symfony2中执行twig结果?

时间:2016-10-07 23:20:19

标签: symfony doctrine

再次,我有一个问题。我正在开发一个具有大约3600条记录的实体的应用程序,当我显示index.html.twig时,这是一个产品列表需要太长时间,大约20秒来显示引导表。

我的实体:

<?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

请给我一个线索!

2 个答案:

答案 0 :(得分:0)

  1. 为关联H:|-8@750-[view]-8@750-|eager设置subLinea提取模式。
  2. 使用此获取模式,将在一个请求中检索来自DB的所有数据。

    unidadMedida
    1. 安装树枝C延长件
      http://twig.sensiolabs.org/doc/installation.html#installing-the-c-extension

答案 1 :(得分:0)

我使用KNPPaginatorBundle对结果进行分页,并且它非常出色,我推荐它:https://github.com/KnpLabs/KnpPaginatorBundle。查看了这篇文章:How to display large table in twig with symfony?