php - Symfony 4 Doctrine 2 findby dosent apply Join 和自定义 join 不起作用

标签 php symfony doctrine-orm entity query-builder

我对 Symfony 4 和 Doctrine ORM 还比较陌生。 我正在尝试获取一位用户在浏览此用户个人资料页面时发布的所有评论。

这是我的评论实体

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\CommentsRepository")
 */
class Comments
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Users", inversedBy="comments")
     * @ORM\JoinColumn(nullable=false)
     */
    private $auteur;

    /**
     * @ORM\Column(type="datetime")
     */
    private $postedAt;

    /**
     * @ORM\Column(type="text")
     */
    private $content;

    /**
     * @ORM\Column(type="integer", options={"default" : 0})
     */
    private $flagged;

    /**
     * @ORM\Column(type="boolean", options={"default" : 0})
     */
    private $validated;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Cards", inversedBy="comments")
     * @ORM\JoinColumn(referencedColumnName="card_id")
     */
    private $postedOnCard;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Users", inversedBy="commentsOnUser")
     */
    private $postedOnUser;

    /**
     * @ORM\Column(type="boolean", options={"default" : 0})
     */
    private $deleted;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getAuteur(): ?users
    {
        return $this->auteur;
    }

    public function setAuteur(?users $auteur): self
    {
        $this->auteur = $auteur;

        return $this;
    }

    public function getPostedAt(): ?\DateTimeInterface
    {
        return $this->postedAt;
    }

    public function setPostedAt(\DateTimeInterface $postedAt): self
    {
        $this->postedAt = $postedAt;

        return $this;
    }

    public function getContent(): ?string
    {
        return $this->content;
    }

    public function setContent(string $content): self
    {
        $this->content = $content;

        return $this;
    }

    public function getFlagged(): ?int
    {
        return $this->flagged;
    }

    public function setFlagged(int $flagged): self
    {
        $this->flagged = $flagged;

        return $this;
    }

    public function getValidated(): ?bool
    {
        return $this->validated;
    }

    public function setValidated(bool $validated): self
    {
        $this->validated = $validated;

        return $this;
    }

    public function getPostedOnCard(): ?cards
    {
        return $this->postedOnCard;
    }

    public function setPostedOnCard(?cards $postedOnCard): self
    {
        $this->postedOnCard = $postedOnCard;

        return $this;
    }

    public function getPostedOnUser(): ?users
    {
        return $this->postedOnUser;
    }

    public function setPostedOnUser(?users $postedOnUser): self
    {
        $this->postedOnUser = $postedOnUser;

        return $this;
    }

    public function getDeleted(): ?bool
    {
        return $this->deleted;
    }

    public function setDeleted(bool $deleted): self
    {
        $this->deleted = $deleted;

        return $this;
    }
}

当我试图获取一个用户的所有评论时,我正在使用此功能

$coms_by_user = $com_repo->findBy(['auteur' => $user->getId()]);

$user 是路由参数,来自/users/profile/$user,它可以工作并为发布了 2 条评论的用户返回一个像这样的数组:

array:2 [▼
  0 => Comments {#842 ▼
    -id: 11
    -auteur: Users {#497 ▼
      -id: 21
      -username: "testtttt"
      -password: "$argon2i$v=19$m=65536,t=4,p=1$S01Da1dseVBDQTBBZ0xJcQ$vvKB4Kfa7GLkhyMhbUqyC7PBjLA1doGxWPBPaXkd5bw"
      -email: "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0a7e6f797e247973676c6564734a7973676c65647324696567" rel="noreferrer noopener nofollow">[email protected]</a>"
      -firstName: "test"
      -lastName: "lol"
      -roles: array:1 [▶]
      -collection: PersistentCollection {#567 ▶}
      -wishlists: PersistentCollection {#493 ▶}
      -registeredAt: DateTime @1580322507 {#495 ▶}
      -comments: PersistentCollection {#427 ▶}
      -commentsOnUser: PersistentCollection {#429 ▶}
      -image: null
    }
    -postedAt: DateTime @1578960000 {#840 ▶}
    -content: "Hello !"
    -flagged: 0
    -validated: false
    -postedOnCard: Cards {#873 ▼
      +__isInitialized__: false
      -cardId: 117
      -cardName: null
      -cardSetNum: null
      -cardAlter: null
      -cardImage: null
      -cardColor: null
      -cardRarity: null
      -cardSet: null
      -cardType: null
      -comments: null
       …2
    }
    -postedOnUser: null
    -deleted: false
  }
  1 => Comments {#871 ▶}
]

正如你所看到的,doctrine 与用户进行了自动加入,为我提供了用户名和评论作者的所有数据。 但是,它没有给我 postsOnCard 和发布评论的卡片之间的连接。所以我无法知道卡名和其他一切。 (postedOnUser 和 users 之间也存在同样的问题)

所以我尝试进行自己的查询,但我几乎尝试了所有方法,但似乎没有任何效果。我总是得到一个空数组。 我通过用户名(来自路由参数)通过 3 个连接(users、postedOnCard、postedOnUser)获取所有评论的方法

/**
     * @return Comments[]
     * @param string $author
     */
    public function findAllWithLocation (string $author) {
        return $this->createQueryBuilder('com')
            ->addSelect('auteur', 'onCard', 'onUser')
            ->join('com.auteur'      , 'auteur')
            ->join('com.postedOnCard', 'onCard')
            ->join('com.postedOnUser', 'onUser')

            ->andWhere('auteur.username = :author')
            ->setParameter('author', $author)

            ->getQuery()
            ->getArrayResult();
    }

该方法运行,但不返回任何内容。我真的不明白。 另外,如果有人可以向我解释为什么所有 find()/findBy/findOneBy 等默认教义方法实际上会自动加入用户。用户表是否具有某种权限?

最佳答案

默认连接是内部连接。这意味着该记录必须存在。

我假设,您的评论表只有 onUser 或 onCard,但很少或从不两者都有。同时调用 ->join('com.onUser', 'onUser')->join('com.onCard', 'onCard') 将导致没有记录正在被退回。

可以通过使用 leftJoin 而不是 join 来解决此问题(其余部分保持不变)。

当未加载关系时,Doctrine 通常返回代理对象。但是,由于您的表(实体)包含要加载的用户的用户 ID,并且该用户已存在于原则的缓存中,因此该用户将被放置在那里,而不是代理对象。对于您评论中的其他关系来说,显然情况并非如此。

用户表没有特殊权限。

如果您总是想要加载实体的某些关系,请查看预先加载(将 fetch="EAGER" 添加到 @ManyToOne 注释)。

关于php - Symfony 4 Doctrine 2 findby dosent apply Join 和自定义 join 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59973645/

相关文章:

php - 从 Paypal 成功付款获取 referer 信息?

php - MongoDB 更新嵌套数组中的字段

php - 在html中显示json

postgresql - 人们预订事件,如何正确限制最大预订数量? (并发)

database - 在没有 Doctrine 的情况下在 Symfony2 中创建实体

symfony - 使用 Doctrine 迁移重命名表名称

php - 如何使用正则表达式在字符串中查找所有 YouTube 视频 ID?

php - Doctrine 查询构建器中的嵌套查询

php - Doctrine2 原生查询多对多

php - 没有从学说查询中获得预期的输出作为获取 mysql native sql 查询,我正在使用学说2-空间扩展