【问题标题】:how to inject a variable in a OneToOne relation entity如何在 OneToOne 关系实体中注入变量
【发布时间】:2016-06-21 03:19:51
【问题描述】:

我有一个 File 实体,用于处理其他实体(新闻/博客/等)中的文件上传。

我用 OneToOne 关系指向它,它工作正常。但我会为每个关系实体更改上传目录:

上传/新闻
上传/博客

上传路径是在我的文件实体中设置的,所以我不知道如何自动更新每个关系的路径...
你知道怎么做吗?
谢谢

【问题讨论】:

  • 请显示您的文件实体定义
  • 它不会帮助你.. ^^ @ORM\OneToOne(targetEntity="File", cascade={"persist"})
  • 您无法将属性与 OneToOne 关联相关联,因此您可以将路径与文件实体(这是 targetEntity 并且您没有显示它)一起存储,或者您将关联解析为 OneToMany/ ManyToOne,您可以在其中拥有关联的属性,例如你的道路 - 但我认为这没有任何意义。
  • 是的,我知道,我想知道的是怎么做:)
  • 所以答案是 - 你不能。我能想到的唯一一件事就是将路径保存为文件实体的额外属性 - 但你不愿意明显地展示它。

标签: file symfony path upload directory


【解决方案1】:

当然可以。 在您的文件实体方面,您可以添加一个 uploadDir 属性,并创建一个像这样的设置器:

private $uploadDir;

public function setUploadDir($uploadDir)
{
    if (!$this->uploadDir) {
        $this->uploadDir = $uploadDir;
    }
}

您的评论建议您将 Symfony 与 Doctrine 一起使用,对吗?

所以你可以像这样编辑经典的 getUploadDir() 方法:

protected function getUploadDir()
{
    return 'uploads/' . $this->uploadDir;
}

在“父”实体中,您必须在持久化或更新之前更新此属性(创建时)。

(我个人使用生命周期回调,但您可以在控制器中手动执行)

use Doctrine\ORM\Mapping as ORM;
/**
 * News
 *
 * @ORM\Table(name="News")
 * @ORM\HasLifecycleCallbacks
 */
class News
{ 
    //....

/**
 * @ORM\OneToOne(targetEntity="File",cascade={"persist","remove"})
 */
private $file;

/**
 * @ORM\PrePersist()
 * @ORM\PreUpdate()
 */
function setUploadDir()
{
    $this->getFile()->setUploadDir('news');
}
// ....

您还可以添加一个常量以使代码更清晰... 希望对你有帮助

【讨论】:

    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2014-01-10
    • 1970-01-01
    • 2012-06-03
    • 2017-09-14
    相关资源
    最近更新 更多