在symfony2.5和doctrine2.x中我尝试按照描述设置分页器 上doctrine documentation
我在article和topten之间有一个oneToOne关系
/**
* Article
*
* @ORM\Table(name="article", indexes={@ORM\Index(name="idx_title", columns={"title"})})
* @ORM\Entity(repositoryClass="My\TestBundle\Entity\ArticleRepository")
*{
class Article
{
/**
* @var integer
*
* @ORM\Column(type="bigint", name="id")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
// ...
/**
* @ORM\OneToOne(targetEntity="My\TestMobileBundle\Entity\Topten", mappedBy="article")
*/
protected $topten;
public function __construct() {
$this->topten = new ArrayCollection();
}
}
Topten 实体:
/**
* Topten
*
* @ORM\Table(name="topten", indexes={@ORM\Index(name="article_id_idx", columns={"article_id"})})
* @ORM\Entity(repositoryClass="My\TestMobileBundle\Entity\ToptenRepository")
*
*/
class Topten
{
/**
* @var integer
*
* @ORM\Column(type="bigint", name="id")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
//...
/**
* @ORM\OneToOne(targetEntity="My\TestBundle\Entity\Article", inversedBy="topten")
* @ORM\JoinColumn(name="article_id", referencedColumnName="id", unique=true)
*/
protected $article;
}
Controller :
$dql = "SELECT a from MyTestBundle:Article a";
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery($dql)
->setFirstResult(0)
->setMaxResults(20);
$articles = new Paginator($query, $fetchJoinCollection = true);
foreach($articles as $article)
{
echo $article->getTitle() . "<br/>\n";
}
//...
Doctrine 现在执行 21 个 Mysql 查询。
每次我打印标题时,它都会执行查询:
SELECT
t0.id AS id1,
//...
FROM
topten t0
WHERE
t0.article_id = ?
我做错了什么或者如何阻止这种行为?
最佳答案
我自己通过向查询添加 setHint 来修复它:
$query = $em->createQuery($dql)
->setHint(\Doctrine\ORM\Query::HINT_FORCE_PARTIAL_LOAD, true)
->setFirstResult(0)
->setMaxResults(20);
我通过阅读 this answer here on stackoverflow 找到了这个答案 似乎是学说中一对一关系的常见问题。
关于php - Symfony 2.5 主义分页器执行多次选择来获取关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25340629/