Symfony 4 Doctrine 2 findby dosent apply Join 和自定义加入不起作用
Symfony 4 Doctrine 2 findby dosent apply Join and custom join doesn't work
我对 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 并且它有效 returns 我为一个发布了 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: "test.symfony@symfony.com"
-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 自动加入用户,给我用户名和评论作者的所有数据。
但是,它没有给我 postedOnCard 和发布评论的卡片之间的连接。所以我不能知道卡名和其他一切。 (postedOnUser 和 users 之间的问题相同)
所以我尝试进行自己的查询,但我尝试了所有乱七八糟的东西,但似乎没有任何效果。我总是得到一个空数组。
我使用 3 个连接(用户、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();
}
方法运行,但 returns 什么也没有。我真的不明白。
另外,如果有人可以向我解释为什么所有 find()/findBy/findOneBy 等默认学说方法实际上使用户自动加入。用户 table 有某种特权吗?
默认联接是内部联接。也就是说,记录必须存在。
我假设,您的评论 table 只出现过 onUser 或 onCard,但很少或从来没有出现过。同时调用 ->join('com.onUser', 'onUser')
和 ->join('com.onCard', 'onCard')
将导致不返回任何记录。
这可以通过使用 leftJoin
而不是 join
来解决(其余保持不变)。
Doctrine 通常 returns 代理对象,当关系未加载时。但是,由于您的 table (实体)包含要加载的用户的用户 ID,并且该用户已经存在于 doctrine 的缓存中,因此用户将被放置在那里而不是代理对象。这显然不适用于您评论中的其他关系。
用户table没有特殊权限。
如果您总是 想要加载实体的某些关系,请查看预先加载(将 fetch="EAGER"
添加到 @ManyToOne
注释)。
我对 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 并且它有效 returns 我为一个发布了 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: "test.symfony@symfony.com"
-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 自动加入用户,给我用户名和评论作者的所有数据。 但是,它没有给我 postedOnCard 和发布评论的卡片之间的连接。所以我不能知道卡名和其他一切。 (postedOnUser 和 users 之间的问题相同)
所以我尝试进行自己的查询,但我尝试了所有乱七八糟的东西,但似乎没有任何效果。我总是得到一个空数组。 我使用 3 个连接(用户、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();
}
方法运行,但 returns 什么也没有。我真的不明白。 另外,如果有人可以向我解释为什么所有 find()/findBy/findOneBy 等默认学说方法实际上使用户自动加入。用户 table 有某种特权吗?
默认联接是内部联接。也就是说,记录必须存在。
我假设,您的评论 table 只出现过 onUser 或 onCard,但很少或从来没有出现过。同时调用 ->join('com.onUser', 'onUser')
和 ->join('com.onCard', 'onCard')
将导致不返回任何记录。
这可以通过使用 leftJoin
而不是 join
来解决(其余保持不变)。
Doctrine 通常 returns 代理对象,当关系未加载时。但是,由于您的 table (实体)包含要加载的用户的用户 ID,并且该用户已经存在于 doctrine 的缓存中,因此用户将被放置在那里而不是代理对象。这显然不适用于您评论中的其他关系。
用户table没有特殊权限。
如果您总是 想要加载实体的某些关系,请查看预先加载(将 fetch="EAGER"
添加到 @ManyToOne
注释)。