序列化可翻译实体
Serialize translateble entity
要翻译我的实体产品,请使用下一个代码
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;
...
Translatable 在 DB product_translation 中使用 table 创建新实体 ProductTranslation,具有 id、translatable_id、locale 和 translatble 属性。
翻译工作完美。在页面中只写 {{ product.translation.en/sp.name }}
当使用 ajax 分页时,对 return 数据使用序列化程序。
尝试了 JMS\Serializer\SerializerBuilder 和 Symfony\Component\Serializer\Serializer
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')) );
没有组序列化 return "Maximum execution time 180second"。
对于组 return 只有产品数据没有翻译。
要解决此问题,必须执行哪些注释或其他操作?请帮忙!
编辑:
尝试使用下一个查询:
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) - 工作但 return 仅限产品,没有翻译。
Maximum execution time 180 second
消息是一个与注释或序列化程序无关的错误。
在您的 php.ini 中,您有一个 max_execution_time
选项来配置脚本的秒数限制。您也可以通过代码set_time_limit($seconds)
函数来设置它,但我不建议使用它。
无论如何,我敢打赌您正在执行一个非常大的查询。您限制了多少个结果?
尼克修复了这个问题:
关于品牌、类别和产品实体
use JMS\Serializer\Annotation\MaxDepth;
/**
* @MaxDepth(1)
*/
private $products;
/**
* @MaxDepth(1)
*/
private $categories;
/**
* @MaxDepth(1)
*/
private $brand;
要翻译我的实体产品,请使用下一个代码
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;
...
Translatable 在 DB product_translation 中使用 table 创建新实体 ProductTranslation,具有 id、translatable_id、locale 和 translatble 属性。 翻译工作完美。在页面中只写 {{ product.translation.en/sp.name }} 当使用 ajax 分页时,对 return 数据使用序列化程序。 尝试了 JMS\Serializer\SerializerBuilder 和 Symfony\Component\Serializer\Serializer
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')) );
没有组序列化 return "Maximum execution time 180second"。 对于组 return 只有产品数据没有翻译。
要解决此问题,必须执行哪些注释或其他操作?请帮忙!
编辑: 尝试使用下一个查询:
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) - 工作但 return 仅限产品,没有翻译。
Maximum execution time 180 second
消息是一个与注释或序列化程序无关的错误。
在您的 php.ini 中,您有一个 max_execution_time
选项来配置脚本的秒数限制。您也可以通过代码set_time_limit($seconds)
函数来设置它,但我不建议使用它。
无论如何,我敢打赌您正在执行一个非常大的查询。您限制了多少个结果?
尼克修复了这个问题: 关于品牌、类别和产品实体
use JMS\Serializer\Annotation\MaxDepth;
/**
* @MaxDepth(1)
*/
private $products;
/**
* @MaxDepth(1)
*/
private $categories;
/**
* @MaxDepth(1)
*/
private $brand;