Symfony+EasyAdmin中Fournisseurs对象无法转字符串问题求助
问题:无法将Fournisseurs实体转换为字符串
错误提示:Object of class App\Entity\Fournisseurs could not be converted to string
需求:在订单管理页面实现选择一个或多个供应商,完成订单与供应商的多对多关联并存储到数据库。已尝试在Orders.php和Fournisseurs.php中添加__toString方法,但问题未解决。技术栈:Symfony + EasyAdmin。
错误原因分析
- Fournisseurs实体缺少正确的
__toString方法:EasyAdmin渲染关联字段时,需要将实体转换为字符串显示,当前Fournisseurs.php未定义该方法。 - Orders实体的
__toString方法引用不存在属性:Orders.php中__toString返回$this->sct_name,但实体无此属性,属于笔误。 - 关联字段配置参数错误:
OrdersCrudController中AssociationField的第二个参数应为显示标签,而非实体属性名。 - 实体关联映射冗余:
Fournisseurs.php中存在orders、orders_obj等未被使用的关联映射,导致ORM映射混乱。
修复步骤
1. 给Fournisseurs实体添加__toString方法
返回供应商名称name_sct,确保EasyAdmin能正确显示供应商选项。
2. 修正Orders实体的__toString方法
改为返回订单编号numero_cmd,避免引用不存在的属性。
3. 调整OrdersCrudController的关联字段配置
将关联字段的显示标签改为“供应商”,明确多对多关联的多选模式。
4. 清理Fournisseurs实体的冗余关联映射
删除未被使用的orders、orders_obj关联,仅保留与Orders对应的多对多映射fournisseurs_orders。
修改后的代码
Fournisseurs.php
<?php namespace App\Entity; use App\Repository\FournisseursRepository; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: FournisseursRepository::class)] class Fournisseurs { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] private ?int $id = null; #[ORM\Column(length: 255)] private ?string $name_sct = null; #[ORM\Column(length: 255)] private ?string $rcs = null; #[ORM\Column(length: 255)] private ?string $adresse = null; #[ORM\Column(length: 255)] private ?string $email = null; #[ORM\Column(length: 8)] private ?string $cp = null; #[ORM\Column(length: 8)] private ?string $tel = null; #[ORM\ManyToMany(targetEntity: Orders::class, mappedBy: 'fournisseur')] private Collection $fournisseurs_orders; #[ORM\Column(length: 255)] private ?string $Ville = null; public function __construct() { $this->fournisseurs_orders = new ArrayCollection(); } public function getId(): ?int { return $this->id; } public function getNameSct(): ?string { return $this->name_sct; } public function setNameSct(string $name_sct): self { $this->name_sct = $name_sct; return $this; } public function getRcs(): ?string { return $this->rcs; } public function setRcs(string $rcs): self { $this->rcs = $rcs; return $this; } public function getAdresse(): ?string { return $this->adresse; } public function setAdresse(string $adresse): self { $this->adresse = $adresse; return $this; } public function getEmail(): ?string { return $this->email; } public function setEmail(string $email): self { $this->email = $email; return $this; } public function getCp(): ?string { return $this->cp; } public function setCp(string $cp): self { $this->cp = $cp; return $this; } public function getTel(): ?string { return $this->tel; } public function setTel(string $tel): self { $this->tel = $tel; return $this; } /** * @return Collection<int, Orders> */ public function getFournisseursOrders(): Collection { return $this->fournisseurs_orders; } public function addFournisseursOrder(Orders $fournisseursOrder): self { if (!$this->fournisseurs_orders->contains($fournisseursOrder)) { $this->fournisseurs_orders->add($fournisseursOrder); $fournisseursOrder->addFournisseur($this); } return $this; } public function removeFournisseursOrder(Orders $fournisseursOrder): self { if ($this->fournisseurs_orders->removeElement($fournisseursOrder)) { $fournisseursOrder->removeFournisseur($this); } return $this; } public function getVille(): ?string { return $this->Ville; } public function setVille(string $Ville): self { $this->Ville = $Ville; return $this; } public function __toString(): string { return $this->name_sct ?? '无名称供应商'; } }
Orders.php
<?php namespace App\Entity; use App\Repository\OrdersRepository; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: OrdersRepository::class)] class Orders { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] private ?int $id = null; #[ORM\Column(length: 255)] private ?string $numero_cmd = null; #[ORM\ManyToMany(targetEntity: Fournisseurs::class, inversedBy: 'fournisseurs_orders')] private Collection $fournisseur; #[ORM\Column(type: Types::DATETIME_MUTABLE)] private ?\DateTimeInterface $date_cmd = null; #[ORM\Column(type: Types::DATETIME_MUTABLE)] private ?\DateTimeInterface $date_rcp = null; #[ORM\Column(length: 255)] private ?string $article = null; #[ORM\Column(length: 255)] private ?string $designation = null; #[ORM\Column(length: 255)] private ?string $qte_cmd_uom = null; #[ORM\Column(length: 255)] private ?string $unite_cmd = null; public function __construct() { $this->fournisseur = new ArrayCollection(); } public function getId(): ?int { return $this->id; } public function getNumeroCmd(): ?string { return $this->numero_cmd; } public function setNumeroCmd(string $numero_cmd): self { $this->numero_cmd = $numero_cmd; return $this; } /** * @return Collection<int, Fournisseurs> */ public function getFournisseur(): Collection { return $this->fournisseur; } public function addFournisseur(Fournisseurs $fournisseur): self { if (!$this->fournisseur->contains($fournisseur)) { $this->fournisseur->add($fournisseur); } return $this; } public function removeFournisseur(Fournisseurs $fournisseur): self { $this->fournisseur->removeElement($fournisseur); return $this; } public function getDateCmd(): ?\DateTimeInterface { return $this->date_cmd; } public function setDateCmd(\DateTimeInterface $date_cmd): self { $this->date_cmd = $date_cmd; return $this; } public function getDateRcp(): ?\DateTimeInterface { return $this->date_rcp; } public function setDateRcp(\DateTimeInterface $date_rcp): self { $this->date_rcp = $date_rcp; return $this; } public function getArticle(): ?string { return $this->article; } public function setArticle(string $article): self { $this->article = $article; return $this; } public function getDesignation(): ?string { return $this->designation; } public function setDesignation(string $designation): self { $this->designation = $designation; return $this; } public function getQteCmdUom(): ?string { return $this->qte_cmd_uom; } public function setQteCmdUom(string $qte_cmd_uom): self { $this->qte_cmd_uom = $qte_cmd_uom; return $this; } public function getUniteCmd(): ?string { return $this->unite_cmd; } public function setUniteCmd(string $unite_cmd): self { $this->unite_cmd = $unite_cmd; return $this; } public function __toString(): string { return $this->numero_cmd ?? '无编号订单'; } }
OrdersCrudController.php
<?php namespace App\Controller\Admin; use App\Entity\Orders; use App\Entity\Fournisseurs; use DateTime; use Doctrine\ORM\EntityManagerInterface; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField; use EasyCorp\Bundle\EasyAdminBundle\Field\IdField; use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField; use EasyCorp\Bundle\EasyAdminBundle\Field\TextField; class OrdersCrudController extends AbstractCrudController { public static function getEntityFqcn(): string { return Orders::class; } public function configureCrud(Crud $crud): Crud { return $crud ->setEntityLabelInPlural('Liste des Commandes'); } public function configureFields(string $pageName): iterable { return [ IdField::new('id')->hideOnForm(), NumberField::new('numero_cmd'), AssociationField::new('fournisseur', '供应商') ->setCrudController(FournisseursCrudController::class) ->setFormTypeOption('multiple', true), DateTimeField::new('date_cmd'), DateTimeField::new('date_rcp'), TextField::new('article'), TextField::new('designation'), NumberField::new('qte_cmd_uom'), NumberField::new('unite_cmd'), ]; } }
内容的提问来源于stack exchange,提问作者G.Franck
相关产品推荐
相关产品推荐

