php - Symfony 4,find() 一个实体
问题描述
感谢 symfony 文档https://symfony.com/doc/current/doctrine.html#updating-an-object,我可以从我的名为“Produit”的实体中使用 get/set 方法。
但是当我调用 setProduit() 方法(来自 Paniers 实体)时,Phpstorm 对 $produitSelected 说“预期的 App\Entity\Paniers,得到了对象”。
我不知道为什么 phpstorm 这么说,因为我能够使用方法,有什么问题?find() 返回一个实体对象,对吧?
class PaniersController extends AbstractController
{
/**
* @Route("/paniers/add/{id}", name="paniers.add")
*/
public function addPanier(Request $request, Environment $twig, RegistryInterface $doctrine, $id)
{
$produitSelected = $doctrine->getRepository(Produit::class)->find($id);
if (!$produitSelected) {
throw $this->createNotFoundException(
'Pas de produit trouvé pour l\' id : '.$id
);
}
$lignePanier=$doctrine->getRepository(Paniers::class)->findOneBy(['produit' => $produitSelected, 'user' =>$this->getUser()]);
if($produitSelected->getStock()>0){
if ($lignePanier){
$quantite =$lignePanier->getQuantite();
$lignePanier->setQuantite($quantite+1);
} else {
$lignePanier = new Paniers();
$lignePanier->setUser($this->getUser())
->setDateAjoutPanier(new \DateTime(date('Y-m-d')))
->setQuantite(1)
->setProduit($produitSelected);
}
$doctrine->getManager()->persist($lignePanier);
$produitSelected->setStock($produitSelected->getStock()-1);
$doctrine->getManager()->persist($produitSelected);
$doctrine->getManager()->flush();
}
}
}
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\PaniersRepository")
* @ORM\Table(name="paniers")
*/
class Paniers
{
//...
/**
* @ORM\ManyToOne(targetEntity="Produit")
* @ORM\JoinColumn(name="produit_id", referencedColumnName="id")
*/
private $produit;
public function getProduit(): ?Produit
{
return $this->produit;
}
public function setProduit(?Produit $produit): self
{
$this->produit = $produit;
return $this;
}
}
解决方案
PhpStorm 显然不是很聪明地理解find($id)
在这种情况下返回值的实际类型将是Produit
. 但你可以帮助它:
/** @var Produit $produitSelected */
$produitSelected = $doctrine->getRepository(Produit::class)->find($id);
要使其正常工作,您应该使用Produit
完整的命名空间或直接在类型提示中添加命名空间。
当然,这并不能保证或确保实际类型是Produit
. 所以,如果你犯了错误,PhpStorm 会报错类型。
推荐阅读
- reactjs - Apollo `subscribeToMore` 变量是否必须与初始查询匹配?
- python - 递归调用方法变量python
- java - Hibernate 不会自己创建 Join Table
- java - 得到一个格式错误的 url 异常,说有协议时没有协议
- java - Android 应用程序在尝试播放媒体时关闭
- php - PHP exec() 从 CMD 编译 VB6
- c++ - 获取地图数组的长度
- python - Pyqt - 在“IconMode”中添加到 QTreeViewItem 时,自定义小部件上的选择突出显示丢失
- android - 使用 SingleChildScrollView 时出现堆栈小部件错误
- java - 如何在 JWT 过滤器中将 api 列入白名单