Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 如何将任何自定义类链接到媒体实体?_Symfony_Sonata Admin_Sonata Media Bundle - Fatal编程技术网

Symfony 如何将任何自定义类链接到媒体实体?

Symfony 如何将任何自定义类链接到媒体实体?,symfony,sonata-admin,sonata-media-bundle,Symfony,Sonata Admin,Sonata Media Bundle,首先,我希望这个问题是相关的,但如果不是,那显然是我愚蠢/搜索不够彻底的错 我被一个看似愚蠢的问题困扰了两天:我只想在我的自定义类中添加一张或多张图片 /** * One people has one image * @ORM\OneToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", mappedBy="people", cascade={"persist"}) */ private $image;

首先,我希望这个问题是相关的,但如果不是,那显然是我愚蠢/搜索不够彻底的错

我被一个看似愚蠢的问题困扰了两天:我只想在我的自定义类中添加一张或多张图片

    /**
 * One people has one image
 * @ORM\OneToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", mappedBy="people", cascade={"persist"})
 */
private $image;
现在最简单的部分如下(据我所知):

  • 将映射字段添加到相关类(我的自定义实体,人员)
  • 向媒体类添加相应的映射字段(从应用程序包到EasyExtend的媒体实体)
  • 对这两个bundle传递d:s:u--force和d:g:enties
  • 删除应用程序包的config/doctor目录,因为它会阻止注释工作(在另一个线程中看到)
  • 在AppBundle的AdminPeople.php中添加相应的字段以添加实体,这取决于关系的性质,这可能会发生明显的变化(我基本上使用的是sonata_type_模型)
现在问题是:我想在媒体表的相应列中保存相关的“人员id”

    /**
 * One people has one image
 * @ORM\OneToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", mappedBy="people", cascade={"persist"})
 */
private $image;
我找不到方法使“人员id”在相应的媒体表中注册。这东西是空的

我检查的内容:

  • 清除缓存
  • 尝试字段的所有可能的关系映射
  • 尝试使用常规AppBundle中其他AdminSomething文件的常规setter/getter
  • 在这个站点上搜索每一个可能的答案,包括从应用程序包中删除config/doctor目录,将config.yml自动映射更改为false,尝试数据库的各种更新(但不是彻底的检修)
  • 不把我的头发拔出来
我怀疑什么:不知何故,我需要重写媒体的Admin类,使该字段对类“可听见”。我不知道怎么做,尽管我尽了最大的努力,我在这个网站上找到的例子也没有帮助

我能做的是:

  • 我可以在自己的管理区添加媒体
  • 我可以在外部管理部分添加媒体,但它们不会保留相关实体的ID。换句话说,它们确实出现在媒体列表中,但不出现在“外部管理”字段列表中
  • 对于其他管理问题的常规外键,您所要做的就是让prePersist/preUpdate使用getter/setter添加它,而我现在似乎无法复制这种行为
既然你们不喜欢没有代码的问题,下面是我的(为了以防万一,从我的composer.json中摘录)

composer.json(相关部分)

Media.php生活在应用程序包中。ORM风格。据我所知,这是正确的注释。相关位:

    /**
 * One Media has one people
 * @ORM\OneToOne(targetEntity="AppBundle\Entity\People", inversedBy="image")
 * @ORM\JoinColumn(name="people_id", referencedColumnName="id")
 *
 */
private $people;
People.php,同样是相关部分(据我所知的获取者和设置者)

peopacemin.php中的字段非常有用,只是它不保留相关人员的id

                ->add('image','sonata_type_model', array(
                'required'=>false,
                'by_reference'=>false,
            ))


    public function prePersist($object)
{
    foreach ($object->getImage() as $item) {
        $item->setPeople($object);
    }
}


public function preUpdate($object)
{
    foreach ($object->getImage() as $item) {
        $item->setPeople($object);
    }

}
现在,当我这样做时,它对媒体部分起作用。事物被创造,尽可能地美丽(welp)。但它不会持久化与创建它的实体相关的任何内容

奇怪的是(或者不是?我不熟悉这个调试工具),我在完成时得到了这个结果(或者我相信是这样)


非常感谢大家(eh)。

试着将表格倒过来,它必须跟踪关系。事实上,你甚至不需要参考媒体上的人。为什么?因为如果你想感谢@mickdev more,你更可能做类似于
$people->getMedia()
(如peodecemin)的事情,而不是
$media->getPeople()
,让他们在下面发布解决方案并接受答案;-)好的,解决方案是简单地将拥有方注释从inversedBy反转到mappedBy,反之亦然!你可以把它贴在@mickdev!顺便说一句,我还能画些糟糕的画!