【问题标题】:Doctrine ManyToMany optimize many queriesDoctrine ManyToMany 优化许多查询
【发布时间】:2015-04-07 06:58:23
【问题描述】:

我有一个实体 PointOfSale,它与自己的标签和类别有多对多的关系,我正在寻找当我从数据库中加载 1k pointsOfSales 及其标签和类别时如何优化查询。

映射:

    /**
 * @ORM\ManyToMany(targetEntity="Tag", inversedBy="pointsOfSales", fetch="EAGER")
 * @Serializer\Groups({"detail","list"})
 * @Serializer\MaxDepth(3)
 * @ORM\JoinTable(name="pointOfSales_tags")
 **/
private $tags;

/**
 * @ORM\ManyToMany(targetEntity="Category", inversedBy="pointsOfSales", fetch="EAGER")
 * @Serializer\Groups({"detail","list"})
 * @Serializer\MaxDepth(3)
 * @ORM\JoinTable(name="pointOfSale_categories")
 **/
private $categories;

当我想返回带有类别和标签的 json 时,总是有 2k 个查询而不是我需要的一个。

我正在使用这个查询:

    $POSqb = $this->createQueryBuilder('pos');
    ->leftJoin('pos.categories','c');
    ->leftJoin('pos.tags','t');

    $query = $POSqb->getQuery();
    return $query->execute();

不管我是使用 JMS 序列化程序还是 fetch eager,还是使用函数从实体获取内容,但学说仍然会使用自己的查询为每个 pointOfSale 获取类别和标签。

有没有办法优化它以在单个查询中使用映射? (分页不是解决方案)

//编辑:另一个选择可能看起来像这样,全部被选中并映射了学说实体

$POSqb = $this->createQueryBuilder('pos')
    ->select('pos','c','t')
    ->leftJoin('pos.categories','c')
    ->leftJoin('pos.tags','t')

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    您可以像这样修改您的查询。

    return $this->getEntityManager()->createQuery("SELECT pos, c, t FROM YourBundle:ClassName pos LEFT JOIN pos.categories c LEFT JOIN pos.tags t ")->getResult();
    

    编辑版本。将你的包名和类名放在 FROM 中。如果您不在存储库中执行此操作,请不要忘记添加 use 语句!

    【讨论】:

    • 这不起作用,因为查询缺少 FROM 语句,但是当我添加 FROM PointOfSale pos 我得到 Error: Class 'PointOfSale' is not defined. 这很奇怪。但我不确定“尝试”是否强制从连接中选择所有内容会强制映射实体类。
    • 哦,真的。类名必须类似于“FROM AmoMainBundle:Company c”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2017-12-24
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 2015-09-23
    相关资源
    最近更新 更多