Php Symfony从代理对象抓取数据
我有下面的代码来获取一个数组,其中包含一个App\Entity\Player。我想知道俱乐部的名称和财产。这给了我一个错误:App\Entity\Player::getClub():返回值的类型必须是Club,proxy\u CG\uu\App\Entity\Club returned。例如,我如何获取俱乐部名称Php Symfony从代理对象抓取数据,php,symfony,doctrine,Php,Symfony,Doctrine,我有下面的代码来获取一个数组,其中包含一个App\Entity\Player。我想知道俱乐部的名称和财产。这给了我一个错误:App\Entity\Player::getClub():返回值的类型必须是Club,proxy\u CG\uu\App\Entity\Club returned。例如,我如何获取俱乐部名称 $player_data = array(); $em = $this->getDoctrine()->getManager();
$player_data = array();
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery("SELECT p FROM App\Entity\Player p WHERE p.user = :id");
$query->setParameter('id', $user_id);
$player = $query->getResult();
array_push($player_data, $player[0]->getClub()->getName());
当我转储$player对象时,会得到以下结果:
请注意代理\u CG\uu\App\Entity\Club
HomeController.php on line 37:
array:1 [▼
0 => App\Entity\Player {#727 ▼
-id: 7
-firstName: "Kevin"
-lastName: "de Bruyne"
-weapon: "Passing"
-position: "Midfield"
-number: 17
-benchmarkPlayerId: 1
-calendar: Proxies\__CG__\App\Entity\Calendar {#387 ▶}
-club: Proxies\__CG__\App\Entity\Club {#734 ▼
+__isInitialized__: false
-id: 2
-name: null
-city: null
-league: null
…2
}
-target: Proxies\__CG__\App\Entity\Target {#743 ▶}
-user: App\Entity\User {#507 ▶}
}
]
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Club
*
* @ORM\Table(name="club", indexes={@ORM\Index(name="league_id", columns={"league_id"})})
* @ORM\Entity
*/
class Club
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=50, nullable=false)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="city", type="string", length=50, nullable=false)
*/
private $city;
/**
* @var \League
*
* @ORM\ManyToOne(targetEntity="League")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="league_id", referencedColumnName="id")
* })
*/
private $league;
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
/**
* @param int $id
*/
public function setId(int $id): void
{
$this->id = $id;
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @param string $name
*/
public function setName(string $name): void
{
$this->name = $name;
}
/**
* @return string
*/
public function getCity(): string
{
return $this->city;
}
/**
* @param string $city
*/
public function setCity(string $city): void
{
$this->city = $city;
}
}
应用\实体\播放器
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Player
*
* @ORM\Table(name="player", indexes={@ORM\Index(name="user_id", columns={"user_id"}), @ORM\Index(name="calendar_id", columns={"calendar_id"}), @ORM\Index(name="club_id", columns={"club_id"}), @ORM\Index(name="target_id", columns={"target_id"})})
* @ORM\Entity
*/
class Player
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="first_name", type="string", length=255, nullable=false)
*/
private $firstName;
/**
* @var string
*
* @ORM\Column(name="last_name", type="string", length=255, nullable=false)
*/
private $lastName;
/**
* @var string
*
* @ORM\Column(name="weapon", type="string", length=255, nullable=false)
*/
private $weapon;
/**
* @var string
*
* @ORM\Column(name="position", type="string", length=50, nullable=false)
*/
private $position;
/**
* @var int
*
* @ORM\Column(name="number", type="integer", nullable=false)
*/
private $number;
/**
* @var int
*
* @ORM\Column(name="benchmark_player_id", type="integer", nullable=false)
*/
private $benchmarkPlayerId;
/**
* @var \Calendar
*
* @ORM\ManyToOne(targetEntity="Calendar")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="calendar_id", referencedColumnName="id")
* })
*/
private $calendar;
/**
* @var \Club
*
* @ORM\ManyToOne(targetEntity="Club")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="club_id", referencedColumnName="id")
* })
*/
private $club;
/**
* @var \Target
*
* @ORM\ManyToOne(targetEntity="Target")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="target_id", referencedColumnName="id")
* })
*/
private $target;
/**
* @var \User
*
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* })
*/
private $user;
public function getId(): ?int
{
return $this->id;
}
/**
* @return string
*/
public function getFirstName(): string
{
return $this->firstName;
}
/**
* @param string $firstName
*/
public function setFirstName(string $firstName): void
{
$this->firstName = $firstName;
}
/**
* @return string
*/
public function getLastName(): string
{
return $this->lastName;
}
/**
* @param string $lastName
*/
public function setLastName(string $lastName): void
{
$this->lastName = $lastName;
}
/**
* @return string
*/
public function getWeapon(): string
{
return $this->weapon;
}
/**
* @param string $weapon
*/
public function setWeapon(string $weapon): void
{
$this->weapon = $weapon;
}
/**
* @return string
*/
public function getPosition(): string
{
return $this->position;
}
/**
* @param string $position
*/
public function setPosition(string $position): void
{
$this->position = $position;
}
/**
* @return int
*/
public function getNumber(): int
{
return $this->number;
}
/**
* @param int $number
*/
public function setNumber(int $number): void
{
$this->number = $number;
}
/**
* @return int
*/
public function getBenchmarkPlayerId(): int
{
return $this->benchmarkPlayerId;
}
/**
* @param int $benchmarkPlayerId
*/
public function setBenchmarkPlayerId(int $benchmarkPlayerId): void
{
$this->benchmarkPlayerId = $benchmarkPlayerId;
}
/**
* @return \Calendar
*/
public function getCalendar(): \Calendar
{
return $this->calendar;
}
/**
* @param \Calendar $calendar
*/
public function setCalendar(\Calendar $calendar): void
{
$this->calendar = $calendar;
}
/**
* @return \Club
*/
public function getClub(): \Club
{
return $this->club;
}
/**
* @param \Club $club
*/
public function setClub(\Club $club): void
{
$this->club = $club;
}
/**
* @return \Target
*/
public function getTarget(): \Target
{
return $this->target;
}
/**
* @param \Target $target
*/
public function setTarget(\Target $target): void
{
$this->target = $target;
}
/**
* @return \User
*/
public function getUser(): \User
{
return $this->user;
}
/**
* @param \User $user
*/
public function setUser(\User $user): void
{
$this->user = $user;
}
}
原则代理自动扩展您的实体(App\entity\Club
)。但是在Player
实体上的方法getClub()
的返回类型中,您有\Club
(完全没有名称空间)。它与App\Entity\Club
(名称空间App\Entity
)不同。您需要更改此类型(以及文件中的其他类型)以使用正确的命名空间
要在返回类型中获取命名空间App\Entity\Club
,您需要使用\App\Entity\Club
(带前导斜杠)或Club
(不带前导斜杠)我认为问题在于您的返回类型\Club
与App\Entity\Club
完全不同。前面的“\”将使PHP在全局名称空间中查找该类,这可能就是类型不匹配的原因。换句话说,Club
引用当前名称空间中的类,即App\Entity\Club
,而\Club
引用全局名称空间中的类。名称空间在文件顶部定义,请参见播放器实体文件中的名称空间:App\Entity
。当我按照您的建议将其更改为App\Entity\Club
的返回类型时。我收到以下错误:App\Entity\Player::getClub():返回值的类型必须为App\Entity\App\Entity\Club,返回的代理\\uuuuu CG\uuuuu\App\Entity\Club。
请尝试将其与前导斜杠一起使用。不带前导斜杠,将当前命名空间用作根。您需要返回\App\Entity\Club
或只返回Club
(不带前导斜杠)@user10031659我更新了我的答案以便更清楚谢谢!!这对我有用。由于我是Symfony的新手,我一整天都在思考这个问题。编辑:仅供参考,我使用PHPstorm生成了getter和setter,所以出现了问题。