Symfony-Doctrine映射导致无限循环

时间:2018-02-15 19:39:17

标签: php symfony doctrine-orm

我有Car对象,它有很多CarHisto对象。我做了实现,但总会出错,因为我得到了一个无限循环......

以下是模型:

class Car {
    /**
     * One Car has Many CarHistos.
     * @ORM\OneToMany(targetEntity="CarHisto", mappedBy="Car")
     */
    private $CarHistos;


    public function __construct()
    {
        $this->CarHistos = new ArrayCollection();
    }

}

class CarHisto
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Car", inversedBy="CarHistos")
     * @ORM\JoinColumn(name="car_id", referencedColumnName="id")
     */
    private $Car;

}

我已经检查了四次,我再次阅读了doctrine pagesymfony page和一个要点。

但我不知道 manytoone onetomany 映射中的无限循环是什么原因。

此代码中出现此问题:

public function syncCarHistos() {
    CarList = $this->em->getRepository(Car::class)->findAll();

    if (empty($CarList))
        $this->logger->warning('Car list is empty!');

    var_dump($CarList[0]);die;
    // other stuff...
}

当var_dump调用时,会创建一个无限循环,而我所看到的并不是那么好看。 我看到每个php文件的内容!

像这样:

["code":"Symfony\Component\Console\Command\Command":private]=>
                              NULL
                              ["synopsis":"Symfony\Component\Console\Command\Command":private]=>
                              array(0) {
                              }
                              ["usages":"Symfony\Component\Console\Command\Command":private]=>
                              array(0) {
                              }
                              ["helperSet":"Symfony\Component\Console\Command\Command":private]=>
                              object(Symfony\Component\Console\Helper\HelperSet)#423 (2) {
                                ["helpers":"Symfony\Component\Console\Helper\HelperSet":private]=>
                                array(4) {
                                  ["formatter"]=>
                                  object(Symfony\Component\Console\Helper\FormatterHelper)#415 (1) {
                                    ["helperSet":protected]=>
                                    *RECURSION*
                                  }
                                  ["debug_formatter"]=>
                                  object(Symfony\Component\Console\Helper\DebugFormatterHelper)#414 (4) {
                                    ["colors":"Symfony\Component\Console\Helper\DebugFormatterHelper":private]=>
                                    array(9) {
                                      [0]=>
                                      string(5) "black"
                                      [1]=>
                                      string(3) "red"

其他Symfony php文件的内容也在循环中。

我确定问题出在$CarHistos类的Car属性中。 因为当我删除Car的那个属性时,没有再发生这个infinty问题,我只能在var_dump中看到一个Car objectum。

syncCarHisto函数由命令运行,所以我认为这就是var_dump中看到Command Symfony类的原因。

class CarHistoSyncCommand extends Command
{
    private $CarService;

    public function __construct(CarService $CarService)
    {
        $this->CarService = $CarService;
        parent::__construct();
    }

    protected function configure()
    {
        parent::configure();
        $this->setName('app:car-histo-sync');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln(['Car Histo Sync', '=====================']);
        $this->CarService->syncCarHisto();
        $output->writeln('Car Histo Sync - Finished.');
    }
}

你在映射中看到我的错误,还是在其他地方? (这个无限循环......)

1 个答案:

答案 0 :(得分:1)

var_dump本身正在造成这种情况。它并不意味着是一个非常大的参考图的调试工具。持久的Doctrine实体包含很多引用,其中许多都是圆形的。

请尝试使用var_dump($carList[0]->getId());。或var_dump(count($carList));

并帮自己一个忙,并开始使用适当的调试器。任何IDE都有能力,甚至是Notepad ++。要检查映射是否有效,请使用:

bin/console doc:sch:val