与Doctrine相关的实体返回所有字段值NULL

时间:2017-09-12 10:50:05

标签: php mysql symfony doctrine opcache

我在使用PHP 5.6.31(使用Zend OPcache 7.0.6-dev),Apache和MySQL(Ver 14.14 Distrib 5.6.37)的服务器上使用Symfony 3.1.10。

我有一个名为文档的实体,其相关实体名为工作人员

这种关系一直有效,直到今天......当我用工人检索文件时,所有工人字段都为空(ID除外)。

因此,如果在我的数据库中有一个有字段的工人:id 4,名字:John,年龄:33 如果我使用此worker relater检索文档并转储$ document-> getWorker(),则返回一个id为4的objet Worker,name:null,age:null。

文档类

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
* @ORM\Table(name="documents")
* @ORM\Entity(repositoryClass="AppBundle\Repository\DocumentRepository")
*/
class Document
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", nullable=true)
     */
    protected $object;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Worker", cascade={"persist"}, inversedBy="documents")
     * @ORM\JoinColumn(name="worker_id", referencedColumnName="id", onDelete="SET NULL")
     */
    protected $worker;

    public function getId()
    {
        return $this->id;
    }

    public function setObject($object)
    {
        $this->object = $object;

        return $this;
    }

    public function getObject()
    {
        return $this->object;
    }

    public function setWorker(\AppBundle\Entity\Worker $worker = null)
    {
        $this->worker = $worker;

        return $this;
    }

    public function getWorker()
    {
        return $this->worker;
    }
}

工人阶级

namespace AppBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints AS Assert;

/**
* @ORM\Entity
* @ORM\Table(name="workers")
* @ORM\Entity(repositoryClass="AppBundle\Repository\WorkerRepository")
*/
class Worker
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", nullable=true)
     * @Assert\NotBlank()
     */
    protected $firstName;

    /**
     * @ORM\Column(type="string", nullable=true)
     * @Assert\NotBlank()
     */
    protected $lastName;

    /**
     * @ORM\Column(type="string", nullable=true)
     * @Assert\NotBlank()
     */
    protected $age;

    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Document", mappedBy="worker")
     */
    protected $documents;

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

    public function __toString() {
        return $this->firstName . ' ' . $this->lastName;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setFirstName($firstName)
    {
        $this->firstName = $firstName;

        return $this;
    }

    public function getFirstName()
    {
        return $this->firstName;
    }

    public function setLastName($lastName)
    {
        $this->lastName = $lastName;

        return $this;
    }

    public function getLastName()
    {
        return $this->lastName;
    }

    public function setAge($age)
    {
        $this->age = $age;

        return $this;
    }

    public function getAge()
    {
        return $this->age;
    }

    public function addDocument(\AppBundle\Entity\Document $document)
    {
        $this->documents[] = $document;

        return $this;
    }

    public function removeDocument(\AppBundle\Entity\Document $document)
    {
        $this->documents->removeElement($document);
    }

    public function getDocuments()
    {
        return $this->documents;
    }
}

我在这里阅读:Doctrine always return null values in production

我尝试了一切,但没有任何作用。

1 个答案:

答案 0 :(得分:0)

这看起来像一个懒惰的加载问题: 当您查询文档时,请参阅查询并未明确询问工作程序,因此未加载该文档。加载了引用。

在这里,你从不打电话给工人,这就是为什么你得到工人{#701 ▼ +__isInitialized__: false

首先,您是否尝试在$document->getWorker()之外调用dump()? dump不会获取嵌套集合以避免压倒内存。它应该在树枝上工作,甚至在基本的回声中工作。 echo $document->getWorker()->getFirstName()

当你找到工作人员时,使用symfony调试器来查看你扔了两个查询,一个用于获取文档,另一个用于获取工作者。你应该避免这种情况。这称为延迟加载。你从来没有要求工人,但是学说是一个非常好的ORM,它足够聪明,可以单独加载它。

当您使用一个实体时,这不是问题,但是当您要获取文档列表时,请考虑额外的数据库工作。

更好的方法是在存储库中使用自定义查询。