Symfony & easyadmin:如何处理依赖实体?
Symfony & easyadmin : how to deal with dependent entities?
我将 easyadmin 与一个实体 "Client" 一起使用,该实体有一个链接到另一个实体 "Country" 的字段。
我设法通过向 Country 实体添加 __toString() 函数来制作管理表单,以避免错误
"Object of class App\Entity\Country could not be converted to string"
.
现在,当我尝试保存条目时,出现错误:
Expected value of type "App\Entity\Country" for association field
"App\Entity\Client#$country
请帮忙!
编辑:
App\Entity\Client :
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Entity(repositoryClass="App\Repository\ClientRepository")
* @Gedmo\SoftDeleteable()
* @UniqueEntity(fields={"companyname", "firstname", "lastname", "email"}, message="There is already an account with this username")
*/
class Client
{
use TimestampableEntity;
use SoftDeleteableEntity;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=50)
*/
private $companyname;
...
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Country")
* @ORM\JoinColumn(nullable=false)
*/
private $country;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\State")
* @ORM\JoinColumn(nullable=false)
*/
private $stateprov;
public function getId(): ?int
{
return $this->id;
}
public function getCompanyname(): ?string
{
return $this->companyname;
}
public function setCompanyname(string $companyname): self
{
$this->companyname = $companyname;
return $this;
}
...
public function getCountry(): ?string
{
return $this->country;
}
public function setCountry(string $country): self
{
$this->country = $country;
return $this;
}
public function getStateprov(): ?state
{
return $this->stateprov;
}
public function setStateprov(?state $stateprov): self
{
$this->stateprov = $stateprov;
return $this;
}
}
App\Entity\Country
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Entity(repositoryClass="App\Repository\CountryRepository")
* @Gedmo\SoftDeleteable()
*/
class Country
{
use TimestampableEntity;
use SoftDeleteableEntity;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=100)
*/
private $name;
/**
* @ORM\Column(type="string", length=3, nullable=true)
*/
private $iso3;
/**
* @ORM\Column(type="string", length=2, nullable=true)
*/
private $iso2;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $phonecode;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $capital;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $currency;
/**
* @ORM\Column(type="smallint")
*/
private $flag;
/**
* @ORM\OneToMany(targetEntity="App\Entity\State", mappedBy="country")
*/
private $states;
public function __construct()
{
$this->states = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getIso3(): ?string
{
return $this->iso3;
}
public function setIso3(?string $iso3): self
{
$this->iso3 = $iso3;
return $this;
}
public function getIso2(): ?string
{
return $this->iso2;
}
public function setIso2(?string $iso2): self
{
$this->iso2 = $iso2;
return $this;
}
public function getPhonecode(): ?string
{
return $this->phonecode;
}
public function setPhonecode(?string $phonecode): self
{
$this->phonecode = $phonecode;
return $this;
}
public function getCapital(): ?string
{
return $this->capital;
}
public function setCapital(?string $capital): self
{
$this->capital = $capital;
return $this;
}
public function getCurrency(): ?string
{
return $this->currency;
}
public function setCurrency(?string $currency): self
{
$this->currency = $currency;
return $this;
}
public function getFlag(): ?int
{
return $this->flag;
}
public function setFlag(int $flag): self
{
$this->flag = $flag;
return $this;
}
/**
* @return Collection|State[]
*/
public function getStates(): Collection
{
return $this->states;
}
public function addState(State $state): self
{
if (!$this->states->contains($state)) {
$this->states[] = $state;
$state->setCountryId($this);
}
return $this;
}
public function removeState(State $state): self
{
if ($this->states->contains($state)) {
$this->states->removeElement($state);
// set the owning side to null (unless already changed)
if ($state->getCountryId() === $this) {
$state->setCountryId(null);
}
}
return $this;
}
public function __toString(){
// to show the name of the Category in the select
return $this->name;
// to show the id of the Category in the select
// return $this->id;
}
}
App\Entity\State
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Entity(repositoryClass="App\Repository\StateRepository")
* @Gedmo\SoftDeleteable()
*/
class State
{
use TimestampableEntity;
use SoftDeleteableEntity;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\Column(type="smallint")
*/
private $flag;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\country", inversedBy="states")
* @ORM\JoinColumn(nullable=false)
*/
private $country;
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getFlag(): ?int
{
return $this->flag;
}
public function setFlag(int $flag): self
{
$this->flag = $flag;
return $this;
}
public function getCountry(): ?country
{
return $this->country;
}
public function setCountry(?country $country): self
{
$this->country = $country;
return $this;
}
public function __toString(){
// to show the name of the Category in the select
return $this->name;
// to show the id of the Category in the select
// return $this->id;
}
}
请从 class Client
中删除 ?string
。因为 getCountry 是 returns Country
class.
class Client {
.......................
public function getCountry():
{
return $this->country;
}
我将 easyadmin 与一个实体 "Client" 一起使用,该实体有一个链接到另一个实体 "Country" 的字段。 我设法通过向 Country 实体添加 __toString() 函数来制作管理表单,以避免错误
"Object of class App\Entity\Country could not be converted to string"
.
现在,当我尝试保存条目时,出现错误:
Expected value of type "App\Entity\Country" for association field "App\Entity\Client#$country
请帮忙!
编辑:
App\Entity\Client :
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Entity(repositoryClass="App\Repository\ClientRepository")
* @Gedmo\SoftDeleteable()
* @UniqueEntity(fields={"companyname", "firstname", "lastname", "email"}, message="There is already an account with this username")
*/
class Client
{
use TimestampableEntity;
use SoftDeleteableEntity;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=50)
*/
private $companyname;
...
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Country")
* @ORM\JoinColumn(nullable=false)
*/
private $country;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\State")
* @ORM\JoinColumn(nullable=false)
*/
private $stateprov;
public function getId(): ?int
{
return $this->id;
}
public function getCompanyname(): ?string
{
return $this->companyname;
}
public function setCompanyname(string $companyname): self
{
$this->companyname = $companyname;
return $this;
}
...
public function getCountry(): ?string
{
return $this->country;
}
public function setCountry(string $country): self
{
$this->country = $country;
return $this;
}
public function getStateprov(): ?state
{
return $this->stateprov;
}
public function setStateprov(?state $stateprov): self
{
$this->stateprov = $stateprov;
return $this;
}
}
App\Entity\Country
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Entity(repositoryClass="App\Repository\CountryRepository")
* @Gedmo\SoftDeleteable()
*/
class Country
{
use TimestampableEntity;
use SoftDeleteableEntity;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=100)
*/
private $name;
/**
* @ORM\Column(type="string", length=3, nullable=true)
*/
private $iso3;
/**
* @ORM\Column(type="string", length=2, nullable=true)
*/
private $iso2;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $phonecode;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $capital;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $currency;
/**
* @ORM\Column(type="smallint")
*/
private $flag;
/**
* @ORM\OneToMany(targetEntity="App\Entity\State", mappedBy="country")
*/
private $states;
public function __construct()
{
$this->states = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getIso3(): ?string
{
return $this->iso3;
}
public function setIso3(?string $iso3): self
{
$this->iso3 = $iso3;
return $this;
}
public function getIso2(): ?string
{
return $this->iso2;
}
public function setIso2(?string $iso2): self
{
$this->iso2 = $iso2;
return $this;
}
public function getPhonecode(): ?string
{
return $this->phonecode;
}
public function setPhonecode(?string $phonecode): self
{
$this->phonecode = $phonecode;
return $this;
}
public function getCapital(): ?string
{
return $this->capital;
}
public function setCapital(?string $capital): self
{
$this->capital = $capital;
return $this;
}
public function getCurrency(): ?string
{
return $this->currency;
}
public function setCurrency(?string $currency): self
{
$this->currency = $currency;
return $this;
}
public function getFlag(): ?int
{
return $this->flag;
}
public function setFlag(int $flag): self
{
$this->flag = $flag;
return $this;
}
/**
* @return Collection|State[]
*/
public function getStates(): Collection
{
return $this->states;
}
public function addState(State $state): self
{
if (!$this->states->contains($state)) {
$this->states[] = $state;
$state->setCountryId($this);
}
return $this;
}
public function removeState(State $state): self
{
if ($this->states->contains($state)) {
$this->states->removeElement($state);
// set the owning side to null (unless already changed)
if ($state->getCountryId() === $this) {
$state->setCountryId(null);
}
}
return $this;
}
public function __toString(){
// to show the name of the Category in the select
return $this->name;
// to show the id of the Category in the select
// return $this->id;
}
}
App\Entity\State
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Entity(repositoryClass="App\Repository\StateRepository")
* @Gedmo\SoftDeleteable()
*/
class State
{
use TimestampableEntity;
use SoftDeleteableEntity;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\Column(type="smallint")
*/
private $flag;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\country", inversedBy="states")
* @ORM\JoinColumn(nullable=false)
*/
private $country;
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getFlag(): ?int
{
return $this->flag;
}
public function setFlag(int $flag): self
{
$this->flag = $flag;
return $this;
}
public function getCountry(): ?country
{
return $this->country;
}
public function setCountry(?country $country): self
{
$this->country = $country;
return $this;
}
public function __toString(){
// to show the name of the Category in the select
return $this->name;
// to show the id of the Category in the select
// return $this->id;
}
}
请从 class Client
中删除 ?string
。因为 getCountry 是 returns Country
class.
class Client {
.......................
public function getCountry():
{
return $this->country;
}