2017-07-27 78 views
0

对于翻译我的实体产品的使用下面的代码序列化translateble实体

use Knp\DoctrineBehaviors\Model as ORMBehaviors; 
class Product 
{ 
    /** 
    * @Groups({"prod_translate"}) 
    */ 
    use ORMBehaviors\Translatable\Translatable; 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @Groups({"prod"}) 
    */ 
    private $id; 
... 

可翻译与DB product_translation与ID,translatable_id,语言环境和translatble性能表中创建新的实体ProductTranslation。 翻译完美。在页面中只需编写{{product.translation.en/sp.name}} 使用ajax pagenation时,使用序列化程序返回数据。 尝试JMS \串行\ SerializerBuilder和Symfony的\分量\串行器\串行

use Symfony\Component\Serializer\Serializer; 
    use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; 
    use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; 
    use Doctrine\Common\Annotations\AnnotationReader; 
$products = $em->getRepository('AppBundle:Product')->findNextPageByBrandCategoryIds(array($cat), $brand, $offset, $limit); 

    $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); 
      $normalizer = new ObjectNormalizer($classMetadataFactory); 
      $normalizer->setCircularReferenceHandler(function ($object) { 
       return $object->getID(); 
      }); 
      $serializer = new Serializer(array($normalizer)); 
      $jsonObject = $serializer->normalize($products, 'json', array('groups' => array('prod', 'prod_translate'))); 

没有组serializet返回 “最长执行时间180秒”。 使用群组仅返回没有翻译的产品数据。

解决此问题需要做什么注释或操作?请帮忙!

编辑: 尝试使用下一个疑问:

public function findNextPageByBrandCategoryIds(array $cat_ids, $brand_id, $offset=0, $limit=8) 
    { 
     $qb = $this->createQueryBuilder('p'); 

     if(!empty($cat_ids)){ 
      $cat_ids = implode(',', $cat_ids); 
      $qb->join('p.categories', 'c') 
      ->where($qb->expr()->in('c.id', $cat_ids)); 
     } 
     if(!empty($brand_id)){ 
      $qb->andWhere('p.brand = :brand') 
      ->setParameter('brand', $brand_id); 
     } 
     if($offset>0){ 
      $qb->setFirstResult($offset); 
     } 
     $qb->setMaxResults($limit); 
     return $qb->getQuery()->getResult(); 
    } 

private function findNextPageByBrandCategoryIds($cat_id, $brand_id, $offset=0, $limit=8) 
    { 
     $em = $this->getDoctrine()->getManager(); 
     $sql = "SELECT p.id, t.id AS translate_id " . 
       "FROM product p INNER JOIN product_translation t ON t.translatable_id = p.id"; 

     $where .= ' WHERE 1=1 ' ; 
     $rsm = new ResultSetMappingBuilder($em); 

     if(!empty($cat_id)){ 
      $sql .= " LEFT JOIN products_categories c ON c.product_id = p.id "; 
      $where .= " AND c.category_id = ".$cat_id; 
     } 
     if(!empty($brand_id)){ 
      $where .= " AND p.brand = ".$brand_id; 
     } 
     $limit = ' LIMIT '.$limit; 

     if($offset>0){ 
      $limit .= ' OFFSET '.$offset; 
     } 
     $sql = $sql.$where.$limit; 

     $rsm->addRootEntityFromClassMetadata('AppBundle\Entity\Product', 'p'); 
     $rsm->addJoinedEntityFromClassMetadata('AppBundle\Entity\ProductTranslation', 't', 'p', 'product', array('id' => 'translatable_id')); 
     $query = $em->createNativeQuery($sql, $rsm); 
     return $query->getResult(); 
    } 

调试几乎每一行 - 他们是对的。

如果使用setHint(\ Doctrine \ ORM \ Query :: HINT_FORCE_PARTIAL_LOAD,true) - 工作但仅返回产品,不带翻译。

回答

0

聂解决这个问题: 在品牌,类别和产品实体

use JMS\Serializer\Annotation\MaxDepth; 
    /** 
    * @MaxDepth(1) 
    */ 
    private $products; 
    /** 
    * @MaxDepth(1) 
     */ 
    private $categories; 

    /** 
    * @MaxDepth(1) 
     */ 
    private $brand; 
0

Maximum execution time 180 second消息是与注释或序列化程序无关的错误。

在你的php.ini中你有一个max_execution_time选项来配置一个脚本的限制,以秒为单位。您也可以通过代码将其设置为功能set_time_limit($seconds),但我不建议使用它。

无论如何,我敢打赌,你正在做一个非常大的查询。您限制了多少结果?

+0

谢谢回答。 (( –

+0

)如果答案解决了你的问题,你可以在绿色检查中标记为正确的单击,如果在我的开发环境中将限制设置为'0' –

+0

这是没有解决的问题 –