【问题标题】:VichUploaderBundle: How to get related entity ID in DirectoryNamer?VichUploaderBundle:如何在 DirectoryNamer 中获取相关实体 ID?
【发布时间】:2015-11-30 15:55:34
【问题描述】:

我正在配置包含在VichUploaderBundle 中的directory namer 以上传多个文件。

我有两个实体 SoundtrackSongSongs 的集合在我的控制器中处理如下:

//...
if ($form->isValid()) {
   $soundtrack->setSlug("sw-ep-vii");
   $soundtrack->setName("Star Wars Episode VII");
   foreach ($soundtrack->getSongs() as $song) {
      $em->persist($song);
   }
   $em->persist($soundtrack);
   $em->flush();
}

当持久化$soundtrack VichUploaderBundle 上传Song 文件并将它们移动到config.yml 中定义的目录或在名为DirectoryNamer 的服务中定义的动态路由,这是我感兴趣的.

在我的SoundtrackDirectoryNamer 中,持久化的Song 实体会自动传递给directoryName() 方法,所以我只想返回关联的Soundtrack.id 作为目录名称,例如:

class SoundtrackDirectoryNamer implements DirectoryNamerInterface
{
    public function directoryName($song, PropertyMapping $mapping)
    {   
        return $song->getSoundtrack()->getId();                                                                                    
    }
}

现在的问题是Soundtrack 仍然没有持久化到数据库中,所以它还没有自动递增的id

如果我将$song->getSoundtrack()->getId() 更改为$song->getSoundtrack()->getSlug(),它会正确创建目录sw-ep-vii,并且一切正常——因为我之前使用$soundtrack->setSlug("sw-ep-vii") 在控制器中设置了slug。

有什么解决方法吗?

【问题讨论】:

    标签: symfony doctrine vichuploaderbundle


    【解决方案1】:

    我是该捆绑包的当前维护者。

    这是一个已知问题(确切地说,这是一个无法解决的问题)。

    目录和文件名是在实体实际保存之前计算的,因此对于新对象,标识符不可用。按照设计,没有什么可以避免这种情况……除非您不使用自动递增的标识符而是使用生成的标识符(例如 UUID 或 slug)。

    【讨论】:

    • 谢谢K-Phoen,在这种情况下,我终于用蛞蝓做这件事了。无论如何,感谢您为这个伟大的捆绑包所做的努力!
    • 谢谢。在保存实体之前是否有解决方法来生成 slug?
    【解决方案2】:

    实际上有一个解决方案,即使它可能并非在所有情况下都完全可靠。这是一个与 MySQL 兼容的示例方法,您可以将其放入您的命名器类中以获取新实体的预期 id(假定注入的实体管理器):

    protected function getNextAutoIncrementedId($object) {
      $meta = $this->em->getClassMetadata(get_class($object));
      if(!$meta) return null;
    
      $conn = $this->em->getConnection();
      $table = $meta->getTableName();
      $sql = "SHOW TABLE STATUS WHERE `Name` = '$table'";
      $result = $conn->query($sql)->fetch(\PDO::FETCH_ASSOC);
      if(empty($result['Auto_increment'])) return null;
    
      return $result['Auto_increment'];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      相关资源
      最近更新 更多