2017-07-27 39 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

這是沒有解決的問題 –