【问题标题】:Doctrine related entities return all fields values NULL教义相关实体返回所有字段值 NULL
【发布时间】:2018-02-20 19:18:06
【问题描述】:

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

我有一个名为 Document 的实体和一个名为 Worker

的相关实体

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

所以如果在我的数据库中有一个工作人员的字段:id 4,姓名:John,年龄:33 如果我用这个工作相关者检索一个文档并转储 $document->getWorker() 我返回一个 id 为 4、名称:null、年龄:null 的对象 Worker。

文档类

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

我尝试了一切,但没有任何效果。

【问题讨论】:

  • 使用注释或配置文件发布您的实体类!
  • 您是否尝试过清除缓存?您发布了一些信息,以便我们能够提供任何帮助。
  • 是的,迈克,我试图清除缓存,重新启动 httpd,重新启动 mysqld,重新启动服务器,运行 composer update,运行 php bin/console 学说:schema:update --force
  • 可以添加你的相关实体
  • 你能发布你的查询和你的实体类吗?您可能会遇到延迟加载。根据给出的少量信息,最好的猜测是更改您的请求,添加加入和选择。

标签: php mysql symfony doctrine opcache


【解决方案1】:

这看起来真的是一个延迟加载问题: 看,当您查询文档时,因为您的查询没有明确要求工作人员,所以它没有加载。引用已加载。

在这里,你永远不会调用工人这就是为什么你得到工人{#701 ▼ +__isInitialized__: false

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

当你得到 worker 时,使用 symfony 调试器查看你抛出了两个查询,一个是获取文档,另一个是获取 worker。你应该避免这种情况。这称为延迟加载。你从来没有要求过 worker,但教义是一个非常好的 ORM,它足够聪明,可以自行加载。

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

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

【讨论】:

  • 在树枝视图中 {{ document.worker.firstName }} 返回什么?
  • 它返回 null 除非我设置 fetch="EAGER"
猜你喜欢
  • 1970-01-01
  • 2021-04-14
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
相关资源
最近更新 更多