php - Symfony Doctrine ORM ManyToMany - 带标签的博客 - 我没有从博客中获取所有标签,没有延迟加载

标签 php mysql symfony orm doctrine-orm

Doctrine lazy loading on manyToMany.

我在我的博客(帖子)中使用 Application\Sonata\ClassificationBundle\Entity\Tag

/**
     * @var string
     *
     * @ORM\ManyToMany(targetEntity="\Application\Sonata\ClassificationBundle\Entity\Tag", cascade={"persist"} )
     * @ORM\JoinTable( name="blog__post_tag" , 
     * joinColumns={ @ORM\JoinColumn( name="blog_post_id", referencedColumnName="id" )},
     * inverseJoinColumns={ @ORM\JoinColumn( name="tag_id", referencedColumnName="id" )}
     * )
     */
    private $tags;

工作代码:

$q = $this->createQueryBuilder('p')
                ->select('p')
                ->innerJoin('p.tags', 't')
                ->where('t = :name')->setParameter('name', $tag)
                ->andWhere('p.isActive = :active')->setParameter('active', TRUE)
                ->orderBy('p.id', 'DESC');
        return $q->getQuery();

从这个输出查询中,我使用了 Twig 中的标签。所以我必须选择帖子和标签。如果我将代码更新为:

$q = $this->createQueryBuilder('p')
                ->select('p', 't')
                ->innerJoin('p.tags', 't')
                ->where('t = :name')->setParameter('name', $tag)
                ->andWhere('p.isActive = :active')->setParameter('active', TRUE)
                ->orderBy('p.id', 'DESC');
        return $q->getQuery();

我只得到一个标签。

信息:

  • 工作代码使用更多数据库查询(另外 1 个查询)。
  • 更新后的代码可以运行(不再有查询)。但结果我的所有帖子只有一个标签

示例:

  • “我的第一篇文章”有标签 ['一','二','三']。
  • “我的第二篇文章”有标签 ['two']。

当我使用第一个查询时。工作正常。但是标签的学说延迟加载代码。我得到 (query1) two = "My First post "有标签 ['one','two','third'] 的输出。 ,“我的第二篇文章”有标签['two']。

当我使用第二个查询时。 (query2) two =“My First post ”的输出具有标签 ['two']。 ,“我的第二篇文章”有标签['two']。

I need all tags from the post. Currently i get only one tag form the post.

最佳答案

由于 INNER JOIN 的原因,会出现这样的情况。关于连接类型的很好的答案在这里:https://stackoverflow.com/a/6188334/919567

此版本的查询适合您:

$q = $this->createQueryBuilder('p')
    ->select('p', 't')
    ->leftJoin('p.tags', 't')
    ->where('t = :name')->setParameter('name', $tag)
    ->andWhere('p.isActive = :active')->setParameter('active', TRUE)
    ->orderBy('p.id', 'DESC');

return $q->getQuery();

关于php - Symfony Doctrine ORM ManyToMany - 带标签的博客 - 我没有从博客中获取所有标签,没有延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35546883/

相关文章:

php - 使用JQuery、PHP和MySQL登录数据验证问题

php - 如何为特定 Controller 操作创建异常事件监听器,以使用其原始参数重定向到另一个操作?

MySQL:如何根据其他表中的信息从多个表中提取信息?

php - 如何在 mysql 中将 2 个 sql 语句组合成一个查询?

PHP/MySQL 查询

php - MySQL - 存储坐标以避免重复

c# - 表被指定了两次,既作为 'UPDATE' 的目标,又作为单独的数据源

symfony - assetic:watch 错误 - unserialize(): 偏移处错误

javascript - 在 Symfony/Twig 响应中缩小/丑化嵌入的 JavaScript

php - 如何将 MySQL 数据库文件 (.sql) 转换为 PHP 中的 SQLite 文件?