我在使用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
我尝试了一切,但没有任何作用。
答案 0 :(得分:0)
这看起来像一个懒惰的加载问题: 当您查询文档时,请参阅查询并未明确询问工作程序,因此未加载该文档。加载了引用。
在这里,你从不打电话给工人,这就是为什么你得到工人{#701 ▼ +__isInitialized__: false
首先,您是否尝试在$document->getWorker()
之外调用dump()
? dump不会获取嵌套集合以避免压倒内存。它应该在树枝上工作,甚至在基本的回声中工作。 echo $document->getWorker()->getFirstName()
当你找到工作人员时,使用symfony调试器来查看你扔了两个查询,一个用于获取文档,另一个用于获取工作者。你应该避免这种情况。这称为延迟加载。你从来没有要求工人,但是学说是一个非常好的ORM,它足够聪明,可以单独加载它。
当您使用一个实体时,这不是问题,但是当您要获取文档列表时,请考虑额外的数据库工作。
更好的方法是在存储库中使用自定义查询。