1

我遇到了一个问题,它无视我所有试图解决它的问题。它可能很简单,我只是在这个上完全筋疲力尽:)

基本上,我想让用户能够将模块(facebook id、bio、文本输入)和资产(图像徽标、pdf 等)添加到页面对象。

我已经为模块和资产与页面建立了单对多关系。

模块按预期工作,但是 Asset 根本不起作用:当 PageController 从其实体调用 getAsset() 时,它为空。在我尝试迭代资产之前没有错误。

此外,在 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);

这让我认为架构是正确的。它至少了解资产与页面相关

我开始觉得我有错字,或者我完全错过了同样明显的东西 - 任何有关故障排除或其他建议的帮助将不胜感激!

app/console --version
Symfony version 2.0.1 - app/dev/debug

页面.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;
}

资产.php

/**
 * @var integer $pageId
 *
 * @ORM\ManyToOne(targetEntity="Page", inversedBy="assets")
 * @ORM\JoinColumn(name="pageId", referencedColumnName="id")
 */
protected $pageId;

模块.php

/**
 * @var integer $pageId
 *
 * @ORM\ManyToOne(targetEntity="Page", inversedBy="modules")
 * @ORM\JoinColumn(name="pageId", referencedColumnName="id")
 */
protected $pageId;

页面控制器.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
4

3 回答 3

2

我得到了它!正如我预测的那样,这是一个令人难以置信的烦人的 PEBKAC....

没有创建关系,因为没有读取注释,因为我在注释评论框中缺少一个 * ..... ddddoooohhhhh!

页面.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;

我只想对所有帮助解决这个问题的人表示非常感谢。

于 2012-06-01T22:19:07.423 回答
0

检查这个: http ://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-bidirectional

您是否正确地将集合初始化到您的页面构造函数中?

于 2012-05-30T06:52:04.470 回答
0

这是因为您没有在 Page 构造函数中初始化 $assets 集合。

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

然后我认为你还没有运行教义:generate:entities 命令,它简化了你的生活,为每个映射字段创建 get、set 和 add 方法。在你的情况下,它会创建一个

public function addModules(Module $modules)
{
    $this->modules[] = $modules;
}

请注意,实际上您只是将 $modules 分配给 $this->modules,这是错误的,它是一个数组而不是一个标量。

并且要添加对每个模块引用的页面的引用,您必须添加另一条指令:

public function addModules(Module $modules)
{
    $this->modules[] = $modules;
    $modules->setPage($this);
}

我已经在我的代码中完成了这个并且它有效,让我知道它是否也适用于你,再见

Linuxatico

于 2012-05-30T11:07:46.010 回答