You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony+EasyAdmin中Fournisseurs对象无法转字符串问题求助

问题:无法将Fournisseurs实体转换为字符串

错误提示:Object of class App\Entity\Fournisseurs could not be converted to string
需求:在订单管理页面实现选择一个或多个供应商,完成订单与供应商的多对多关联并存储到数据库。已尝试在Orders.php和Fournisseurs.php中添加__toString方法,但问题未解决。技术栈:Symfony + EasyAdmin。

错误原因分析

  1. Fournisseurs实体缺少正确的__toString方法:EasyAdmin渲染关联字段时,需要将实体转换为字符串显示,当前Fournisseurs.php未定义该方法。
  2. Orders实体的__toString方法引用不存在属性:Orders.php中__toString返回$this->sct_name,但实体无此属性,属于笔误。
  3. 关联字段配置参数错误:OrdersCrudController中AssociationField的第二个参数应为显示标签,而非实体属性名。
  4. 实体关联映射冗余: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:45:29