我遇到了一个无法解决所有问题的问题。它可能很简单,我在这一个上完全筋疲力尽了:))
基本上我想让用户能够将模块(facebook id,生物,文本输入)和资产(图像徽标,pdf等)添加到页面对象中。
我已经为Module和Asset to Page建立了一个onetomany关系。
模块按预期工作,但Asset根本不起作用:当PageController从其实体调用getAsset()时,它为null。在我尝试迭代资产之前没有错误。
此外,在PageController中还有以下命名空间声明:
use Linkme\SiteBundle\Entity\Module;
use Linkme\SiteBundle\Entity\Asset;
如果我删除了Module声明,则会出现错误,但是如果我删除了Asset行,则没有任何更改。因此,我认为这种关系并未创造。
如果我跑
app/console doctrine:schema:create --dump-sql
然后我得到以下一行:
ALTER TABLE Asset ADD CONSTRAINT FK_C36E75589D3B65E3 FOREIGN KEY (pageId) REFERENCES Page(id);
这让我觉得架构是正确的。它至少理解资产与Page
有关我开始觉得我有一个错字或者我完全错过了一些同样明显的东西 - 任何有关故障排除或其他建议的帮助都会非常感激!
app/console --version
Symfony version 2.0.1 - app/dev/debug
page.php文件
/*
* @ORM\OneToMany(targetEntity="Asset", mappedBy="pageId", cascade={"persist", "remove"})
* @ORM\OrderBy({"type" = "ASC"})
* @ORM\OrderBy({"id" = "ASC"})
*
* @var ArrayCollection $assets
*/
protected $assets;
/**
* @ORM\OneToMany(targetEntity="Module", mappedBy="pageId", cascade={"persist", "remove"})
* @ORM\OrderBy({"type" = "ASC"})
* @ORM\OrderBy({"id" = "ASC"})
*
* @var ArrayCollection $modules
*/
protected $modules;
/**
* Set assets
* @param Asset $assets
*/
public function setAssets(Asset $assets = null)
{
$this->assets = $assets;
}
/**
* Get assets
*
* @return Asset
*/
public function getAssets()
{
echo '<br />Asset is '.gettype($this->assets); // outut: Asset is NULL
return $this->assets;
}
/**
* Set modules
* @param Module $modules
*/
public function setModules(Module $modules = null)
{
$this->modules = $modules;
}
/**
* Get modules
* @return Module
*/
public function getModules()
{
echo '<br />Module is '.gettype($this->assets); // output: Module is object
return $this->modules;
}
Asset.php
/**
* @var integer $pageId
*
* @ORM\ManyToOne(targetEntity="Page", inversedBy="assets")
* @ORM\JoinColumn(name="pageId", referencedColumnName="id")
*/
protected $pageId;
Module.php
/**
* @var integer $pageId
*
* @ORM\ManyToOne(targetEntity="Page", inversedBy="modules")
* @ORM\JoinColumn(name="pageId", referencedColumnName="id")
*/
protected $pageId;
PageController.php
use Linkme\SiteBundle\Entity\Module;
use Linkme\SiteBundle\Entity\Asset;
/**
* Add modules and assets to a page
*
* @Route("/{id}/wizardmodule", name="page_wizardmodule")
* @Template()
*/
public function wizardmoduleAction($id)
{
$em = $this->getDoctrine()->getEntityManager();
$page = $em->getRepository('LinkmeSiteBundle:Page')->find($id);
$modules = $page->getModules();
$assets = $page->getAssets();
depmod
[symfony]
git=http://github.com/symfony/symfony.git
version=v2.0.1
[twig]
git=http://github.com/fabpot/Twig.git
version=v1.1.2
[monolog]
git=http://github.com/Seldaek/monolog.git
version=1.0.1
[doctrine-common]
git=http://github.com/doctrine/common.git
version=2.1.1
[doctrine-dbal]
git=http://github.com/doctrine/dbal.git
version=2.1.1
[doctrine]
git=http://github.com/doctrine/doctrine2.git
version=2.1.1
[swiftmailer]
git=http://github.com/swiftmailer/swiftmailer.git
version=v4.1.1
[assetic]
git=http://github.com/kriswallsmith/assetic.git
version=v1.0.1
[twig-extensions]
git=http://github.com/fabpot/Twig-extensions.git
[metadata]
git=http://github.com/schmittjoh/metadata.git
version=1.0.0
[SensioFrameworkExtraBundle]
git=http://github.com/sensio/SensioFrameworkExtraBundle.git
target=/bundles/Sensio/Bundle/FrameworkExtraBundle
version=v2.0.1
[JMSSecurityExtraBundle]
git=http://github.com/schmittjoh/JMSSecurityExtraBundle.git
target=/bundles/JMS/SecurityExtraBundle
version=v2.0.1
[SensioDistributionBundle]
git=http://github.com/sensio/SensioDistributionBundle.git
target=/bundles/Sensio/Bundle/DistributionBundle
version=v2.0.1
[SensioGeneratorBundle]
git=http://github.com/sensio/SensioGeneratorBundle.git
target=/bundles/Sensio/Bundle/GeneratorBundle
version=v2.0.1
[AsseticBundle]
git=http://github.com/symfony/AsseticBundle.git
target=/bundles/Symfony/Bundle/AsseticBundle
version=v1.0.0
答案 0 :(得分:2)
我明白了!正如我预测的那样,这是一个令人难以置信的恼人的PEBKAC ......
由于注释没有被读取,因此没有创建关系,因为我在注释注释框中缺少* ... ddddoooohhhhh!
page.php文件
在:
/* <========================== there is only one * here. It needs to be two: **
* @ORM\OneToMany(targetEntity="Asset", mappedBy="pageId", cascade={"persist", "remove"})
* @ORM\OrderBy({"type" = "ASC"})
* @ORM\OrderBy({"id" = "ASC"})
*
* @var ArrayCollection $assets
*/
protected $assets;
后:
/** <========================== like this.
* @ORM\OneToMany(targetEntity="Asset", mappedBy="pageId", cascade={"persist", "remove"})
* @ORM\OrderBy({"type" = "ASC"})
* @ORM\OrderBy({"id" = "ASC"})
*
* @var ArrayCollection $assets
*/
protected $assets;
我非常感谢帮助解决这个问题的所有人。
答案 1 :(得分:0)
您是否正确地将集合初始化为页面构造函数?
答案 2 :(得分:0)
这是因为您没有在Page构造函数中初始化$ assets集合。
public function __construct(){
$this->assets = new ArrayCollection();
}
然后我认为你没有运行doctrine:generate:entities命令,它简化了你的生活,为每个映射字段创建get,set和add方法。在你的情况下,它会创建一个
public function addModules(Module $modules)
{
$this->modules[] = $modules;
}
请注意,实际上您只需将$ modules分配给$ this-&gt;模块,这是错误的,它是一个数组而不是标量。
要添加对每个模块引用的页面的引用,您必须添加另一条指令:
public function addModules(Module $modules)
{
$this->modules[] = $modules;
$modules->setPage($this);
}
我已经在我的代码中完成了这项工作并且它有效,让我知道它是否适合你,再见
Linuxatico