关系一对多 return 空对象
Relation One to Many return empty object
我有一个评估实体,它有一个产品和一个可以有多个评估的产品。我正在尝试获取一个产品并获取与我的实体关联的评估列表
Produit.php
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use phpDocumentor\Reflection\Types\This;
/**
* Produit
*
* @ORM\Table(name="produit", indexes={@ORM\Index(name="fk_idcatedel", columns={"idCategorie"})})
* @ORM\Entity
*/
class Produit
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string|null
*
* @ORM\Column(name="libelle", type="string", length=20, nullable=true)
*/
private $libelle;
/**
* @var float|null
*
* @ORM\Column(name="prix", type="float", precision=10, scale=0, nullable=true)
*/
private $prix;
/**
* @var string|null
*
* @ORM\Column(name="description", type="string", length=50, nullable=true)
*/
private $description;
/**
* @var int
*
* @ORM\Column(name="qt", type="integer", nullable=false)
*/
private $qt;
/**
* @var string|null
*
* @ORM\Column(name="img", type="string", length=255, nullable=true)
*/
private $img;
/**
* @var \Categorie
*
* @ORM\ManyToOne(targetEntity="Categorie")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="idCategorie", referencedColumnName="id")
* })
*/
private $idcategorie;
/**
* @ORM\OneToMany(targetEntity="Evaluation", mappedBy="idProduit")
*/
private $rates;
public function __construct()
{
$this->rates = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getLibelle(): ?string
{
return $this->libelle;
}
public function setLibelle(?string $libelle): self
{
$this->libelle = $libelle;
return $this;
}
public function getPrix(): ?float
{
return $this->prix;
}
public function setPrix(?float $prix): self
{
$this->prix = $prix;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getQt(): ?int
{
return $this->qt;
}
public function setQt(int $qt): self
{
$this->qt = $qt;
return $this;
}
public function getImg(): ?string
{
return $this->img;
}
public function setImg(?string $img): self
{
$this->img = $img;
return $this;
}
public function getIdcategorie(): ?Categorie
{
return $this->idcategorie;
}
public function setIdcategorie(?Categorie $idcategorie): self
{
$this->idcategorie = $idcategorie;
return $this;
}
/**
* @return Collection|Evaluation[]
*/
public function getRates(): Collection
{
return $this->rates;
}
}
Evaluation.php
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Evaluation
*
* @ORM\Table(name="evaluation", indexes={@ORM\Index(name="fk_idprodevaldel", columns={"id_produit"}), @ORM\Index(name="fk_iduser", columns={"id_user"})})
* @ORM\Entity
*/
class Evaluation
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var int
*
* @ORM\Column(name="note", type="integer", nullable=false)
*/
private $note;
/**
* @var \Produit
*
* @ORM\ManyToOne(targetEntity="Produit", inversedBy="rates")
* @ORM\JoinColumn(name="id_produit", referencedColumnName="id")
*/
private $idProduit;
/**
* @var \Compte
*
* @ORM\ManyToOne(targetEntity="Compte")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_user", referencedColumnName="email")
* })
*/
private $idUser;
public function getId(): ?int
{
return $this->id;
}
public function getNote(): ?int
{
return $this->note;
}
public function setNote(int $note): self
{
$this->note = $note;
return $this;
}
public function getIdProduit(): ?Produit
{
return $this->idProduit;
}
public function setIdProduit(?Produit $idProduit): self
{
$this->idProduit = $idProduit;
return $this;
}
public function getIdUser(): ?Compte
{
return $this->idUser;
}
public function setIdUser(?Compte $idUser): self
{
$this->idUser = $idUser;
return $this;
}
}
数据库
在我的控制器中,我成功地从产品中获取了信息,但是费率是空的
$produits = $this->getDoctrine()
->getRepository(Produit::class)
->find(1);
dump($produits);
$rates = $produits->getRates();
dump($rates); // #collection: ArrayCollection is empty
输出:
由于 lazy loading,集合尚未初始化,这是理所当然的。如果您至少不能访问集合中的某个元素,则加载整个集合是没有意义的,因为原则可以安全地假设您会“丢弃”它。一旦您访问一个元素(通过循环到集合或获取特定元素),集合将被初始化并且您拥有所有项目。
另一种方法是使用 EAGER 提取,它将在水合阶段加载整个集合。但是,我不会推荐它,除非您确定每次加载 Produit
时都需要此集合“准备就绪”。即使在后一种情况下,我也会“手动”处理集合,因为我建议不要失去对它的控制(让我们假装里面有很多元素)。
阅读有关代理和关联的更多信息,here
我有一个评估实体,它有一个产品和一个可以有多个评估的产品。我正在尝试获取一个产品并获取与我的实体关联的评估列表
Produit.php
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use phpDocumentor\Reflection\Types\This;
/**
* Produit
*
* @ORM\Table(name="produit", indexes={@ORM\Index(name="fk_idcatedel", columns={"idCategorie"})})
* @ORM\Entity
*/
class Produit
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string|null
*
* @ORM\Column(name="libelle", type="string", length=20, nullable=true)
*/
private $libelle;
/**
* @var float|null
*
* @ORM\Column(name="prix", type="float", precision=10, scale=0, nullable=true)
*/
private $prix;
/**
* @var string|null
*
* @ORM\Column(name="description", type="string", length=50, nullable=true)
*/
private $description;
/**
* @var int
*
* @ORM\Column(name="qt", type="integer", nullable=false)
*/
private $qt;
/**
* @var string|null
*
* @ORM\Column(name="img", type="string", length=255, nullable=true)
*/
private $img;
/**
* @var \Categorie
*
* @ORM\ManyToOne(targetEntity="Categorie")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="idCategorie", referencedColumnName="id")
* })
*/
private $idcategorie;
/**
* @ORM\OneToMany(targetEntity="Evaluation", mappedBy="idProduit")
*/
private $rates;
public function __construct()
{
$this->rates = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getLibelle(): ?string
{
return $this->libelle;
}
public function setLibelle(?string $libelle): self
{
$this->libelle = $libelle;
return $this;
}
public function getPrix(): ?float
{
return $this->prix;
}
public function setPrix(?float $prix): self
{
$this->prix = $prix;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getQt(): ?int
{
return $this->qt;
}
public function setQt(int $qt): self
{
$this->qt = $qt;
return $this;
}
public function getImg(): ?string
{
return $this->img;
}
public function setImg(?string $img): self
{
$this->img = $img;
return $this;
}
public function getIdcategorie(): ?Categorie
{
return $this->idcategorie;
}
public function setIdcategorie(?Categorie $idcategorie): self
{
$this->idcategorie = $idcategorie;
return $this;
}
/**
* @return Collection|Evaluation[]
*/
public function getRates(): Collection
{
return $this->rates;
}
}
Evaluation.php
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Evaluation
*
* @ORM\Table(name="evaluation", indexes={@ORM\Index(name="fk_idprodevaldel", columns={"id_produit"}), @ORM\Index(name="fk_iduser", columns={"id_user"})})
* @ORM\Entity
*/
class Evaluation
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var int
*
* @ORM\Column(name="note", type="integer", nullable=false)
*/
private $note;
/**
* @var \Produit
*
* @ORM\ManyToOne(targetEntity="Produit", inversedBy="rates")
* @ORM\JoinColumn(name="id_produit", referencedColumnName="id")
*/
private $idProduit;
/**
* @var \Compte
*
* @ORM\ManyToOne(targetEntity="Compte")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_user", referencedColumnName="email")
* })
*/
private $idUser;
public function getId(): ?int
{
return $this->id;
}
public function getNote(): ?int
{
return $this->note;
}
public function setNote(int $note): self
{
$this->note = $note;
return $this;
}
public function getIdProduit(): ?Produit
{
return $this->idProduit;
}
public function setIdProduit(?Produit $idProduit): self
{
$this->idProduit = $idProduit;
return $this;
}
public function getIdUser(): ?Compte
{
return $this->idUser;
}
public function setIdUser(?Compte $idUser): self
{
$this->idUser = $idUser;
return $this;
}
}
数据库
在我的控制器中,我成功地从产品中获取了信息,但是费率是空的
$produits = $this->getDoctrine()
->getRepository(Produit::class)
->find(1);
dump($produits);
$rates = $produits->getRates();
dump($rates); // #collection: ArrayCollection is empty
输出:
由于 lazy loading,集合尚未初始化,这是理所当然的。如果您至少不能访问集合中的某个元素,则加载整个集合是没有意义的,因为原则可以安全地假设您会“丢弃”它。一旦您访问一个元素(通过循环到集合或获取特定元素),集合将被初始化并且您拥有所有项目。
另一种方法是使用 EAGER 提取,它将在水合阶段加载整个集合。但是,我不会推荐它,除非您确定每次加载 Produit
时都需要此集合“准备就绪”。即使在后一种情况下,我也会“手动”处理集合,因为我建议不要失去对它的控制(让我们假装里面有很多元素)。
阅读有关代理和关联的更多信息,here