Symfony 在预持久上将数据添加到对象

2023-12-05

我有一个用于创建文档的表格。一方面,我可以添加名称和描述,在旁边我可以选择一个或多个机构创建的文档属于谁。 每个机构被分配一个specific市场(一共有7个市场,所以一个市场可以有多个代理机构,但一个代理机构只能属于一个市场!) 我想要实现的是“prePersist”功能,它会自动将正确的市场(取决于所选机构的数量)添加到文档中。

我的文档实体有两个实体(市场和机构)以及相应的 getter 和 setter:

 /**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Market", inversedBy="uploadProfiles", cascade={"persist"})
* @ORM\JoinTable(name="document_uploadprofile_markets",
*   joinColumns={@ORM\JoinColumn(name="uploadprofile_id", referencedColumnName="id")},
*   inverseJoinColumns={@ORM\JoinColumn(name="market_id", referencedColumnName="id")})
**/
private $markets;

        /**
         * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Agency", inversedBy="uploadProfiles", cascade={"persist"})
         * @ORM\JoinTable(name="document_uploadprofile_agencies",
         *   joinColumns={@ORM\JoinColumn(name="uploadprofile_id", referencedColumnName="id")},
         *   inverseJoinColumns={@ORM\JoinColumn(name="iata8", referencedColumnName="iata8")})
         **/
        private $agencies;
  public function __construct()
    {
        $this->agencies = new \Doctrine\Common\Collections\ArrayCollection();
    $this->markets = new \Doctrine\Common\Collections\ArrayCollection();

}

       /**
 * Add market
 *
 * @param \AppBundle\Entity\Market $market
 *
 * @return UploadProfile
 */
public function addMarket(\AppBundle\Entity\Market $market)
{
    $this->markets[] = $market;

    return $this;
}

/**
 * Remove market
 *
 * @param \AppBundle\Entity\Market $market
 */
public function removeMarket(\AppBundle\Entity\Market $market)
{
    $this->markets->removeElement($market);
}

/**
 * Get markets
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getMarkets()
{
    return $this->markets;
}
  /**
     * Add agency
     *
     * @param \AppBundle\Entity\Agency $agency
     *
     * @return UploadProfile
     */
    public function addAgency(\AppBundle\Entity\Agency $agency)
    {
        $this->agencies[] = $agency;

        return $this;
    }

    /**
     * Remove agency
     *
     * @param \AppBundle\Entity\Agency $agency
     */
    public function removeAgency(\AppBundle\Entity\Agency $agency)
    {
        $this->agencies->removeElement($agency);
    }

    /**
     * Get agencies
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getAgencies()
    {
        return $this->agencies;
    }

我知道我可以将 prePersist 函数添加到我的文档实体中,并尝试编写我想要实现的目标,但我认为这不起作用,因为我需要类似的东西:

  foreach($document->getAgencies() as $agency) {
      $document->setMarket($em->getRepository('AppBundle:Agency')->getMarket($agency));
     }

我什至不确定 foreach 循环是否正确,因为(到目前为止)结果始终为空。我已经在这里向该主题提出了一个问题:Symfony 在 CreateController 中使用 Arraycollection 的 setter

我还尝试编写一个自己的存储库函数,以从我的代理实体获取所有不同的市场,但到目前为止这也不起作用。

另一个想法是我的表单类中的 POST_SUBMIT 事件侦听器,但到目前为止这对我来说也没有意义。

有任何想法吗?如果需要更多代码,请告诉我!

edit我编辑并更改了上面的代码,以便在我的市场和文档之间建立多种关系。然后我尝试的是,将 prePersist 函数添加到我的文档实体中,它实际上工作得很好,同时仍然具有 OneToMany 关系(它总是覆盖以前的市场,但现在并不重要) 我现在正在尝试编辑该函数,以便可以将多个市场添加到文档中。 我有两个想法,但都没有实现:

if(count($this->getAgencies()) > 0){
      foreach($this->getAgencies() as $agency) {
        $this->addMarket($agency->getMarket());
      }
}

--> 市场永远是空的

or

if(count($this->getAgencies()) > 0){
      $upId = rtrim($this->getId(),"_up");
      $query = $em->createQuery("SELECT DISTINCT (a.market) FROM UserBundle\Entity\User u JOIN u.agencies a WHERE u.id = $userId");
      $marketIds = $query->getResult();

      $em = $this->getDoctrine ()->getManager ();
      $repository = $this->getDoctrine()
      ->getRepository('AppBundle:Market');
      $markets = $repository->findOneById($marketIds);
      $this->addMarket($markets);
    }
  }

update

这是我的文档实体中的 prepersist 函数,然后是 getMarkets() 函数,这是在评论之一中建议的。我将名称更改为 addMarkets 而不是 getMarkets

/**
    * @ORM\PrePersist
    */
    public function prePersist() {
if(count($this->getAgencies()) > 0){
      foreach($this->getAgencies() as $agency) {
        $this->addMarkets($agency->getMarket());
      }
    }
  }

public function addMarkets(\AppBundle\Entity\Market $market)
  {
      $markets = array();
      foreach($this->agencies as $agency) {
          $market = $agency->getMarket();
          $id     = $market->getId();

          // Skip duplicates
          if (isset($markets['id'])) {
              continue;
          }

          $markets[$id] = $market;
      }

      return $markets;
  }

另一种方法

所以我再次编辑它,现在我的函数看起来像这样

$markets = $this->getMarkets();
if(count($this->getAgencies()) > 0){
  foreach($this->getAgencies() as $agency) {
    if(!$this->markets->contains($markets)) {
      $this->addMarket($agency->getMarket());
    }
    return;
    dump($markets);
  }
}

我认为这可能有助于消除我的重复项,但事实并非如此..知道为什么吗?


这是逻辑上的结构性错误。线索就在你的问题和代码中。

自动添加正确的市场(s)

And:

        /**
        * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Market")
        * @ORM\JoinColumn(name="market", referencedColumnName="id")
        * @var \AppBundle\Entity\Market
        **/
        private $market;

不兼容。

如果一份文件可以有多个机构,而机构可以有一个市场,那么您的文件必须考虑到多个市场。例如:

DocumentA has Agency1 and Agency2. 

Agency1 has MarketParis.

Agency2 has MarketMarrakesh.

这必然意味着 DocumentA 拥有(Agency1 的)MarketParis 和(Agency2 的)MarketMarrakesh——许多市场。

您问的问题是一个比设置或获取更大的主题。如果您只想每个文档有一个市场,那么您必须强制文档机构之间的唯一性。例如:

Your form creates DocumentA.

The user tries to set Agency1 (MarketParis) and Agency2 (MarketMarrakesh).
This throws an error because there can be ONLY ONE market.

或者另一个例子:

Your form creates DocumentA

The user tries to set Agency1 (MarketParis) and Agency3 (MarketParis). 
This is successful because the uniqueness of the Document's Market is enforced. 

这有很多策略,并且是一个比您的问题大得多的主题。

EDIT

如果您的基数逻辑是正确的(解决了我上面描述的任何问题)并且您的学说注释包括在所有实体中持续存在的级联,从上面的代码看起来是正确的。我能想到的唯一不能正常工作的是表单的“by_reference”属性。将“by_reference”设置为false在您的表单中,在实体中设置了级联持久性,应该保留与表单关联的所有实体。请参阅此处的 by_reference 文档:http://symfony.com/doc/current/reference/forms/types/collection.html#by-reference

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symfony 在预持久上将数据添加到对象 的相关文章

随机推荐

  • Flutter如何使用setState()

    我的路线之一显示了存储在的当前数据firestore数据库 我正在调用该函数来检索数据firestore in the initState方法 该页面将显示从以下位置检索到的所有数据firestore 它工作正常 即当用户导航到此页面 qu
  • 如何执行对话框命令,并使其返回到原始屏幕?

    新人 不知道怎么问这个问题 简洁版本 执行shell命令后 会返回原来的界面 有什么技巧呢 长版 我正在使用以下命令编写 shell 脚本dialog 假设它将打开一个基于控制台的 UI 那么当我退出它时 它将如下所示 run a scri
  • 通过 firebase 身份验证检查来反应路由器保护的路由

    我想实现受保护的路由 并使用 firebase 进行身份验证 我的浏览器因这段代码而冻结 const App React FC gt const authentication setAuthState useState authentica
  • 类库中带有 POCO 的 EF 4 作为 MVC 2 模型

    我正在探索 Entity Framework 4 并使用 POCO 作为 MVC2 Web 应用程序的模型 我需要将模型和数据访问代码放在单独的库中 因为这样我就可以与另一个 Web 应用程序共享它 该应用程序充当客户访问数据的门户 我的问
  • 在javascript中创建带有下拉框的提示输入对话框?

    有谁知道如何在javascript中创建带有下拉框的提示输入对话框 Example 我认为这是不可能的 您可能必须使用某种模式框 查看 jQuery UI 的模式框 http jqueryui com demos dialog
  • Java if 与 try/catch 开销

    Java 中使用 a 是否有任何开销试着抓块 而不是if block 假设所附代码不要求如此 例如 采用以下两个字符串 安全修剪 方法的简单实现 public String tryTrim String raw try return raw
  • 使用“IN”SQL 函数中的值将逗号分隔值从 .NET 传递到存储过程

    我有一个类似于以下的 SQL 查询 create procedure test param1 nvarchar max as begin select from table where column1 in param1 end 现在我需要
  • 如何使用相同的对象属性创建多个关系?

    我正在使用 protege 5 来开发本体 我创造了has composition作为对象属性 在我的本体中 相同的 object property 用于不同的域及其各自的范围 例如has compositionA 是 B 并且has co
  • 是否可以使用Python的默认互联网浏览器打开某些网址?

    我希望 python 使用计算机默认的网络浏览器打开某个地址 这可能吗 绝对可以 使用网页浏览器 module
  • 当调用 Activity 被销毁时,Android 新 Activity 上的 getIntent 为 NULL

    你们有解决以下问题的方法吗 在注册活动的 onDestroy 中 当用户按下后退按钮时 我调用一个新活动 以便用户可以输入当天的一些最终生产数据 然后通过电子邮件发送报告 问题是 在刚刚启动的活动中 对 getIntent 的调用返回 nu
  • 删除表中过滤的行而不是整个行

    过滤表格时 如何仅删除表格行而不删除整个工作表行 Dim TradeTable As Excel ListObject Set TradeTable Sheets Pre Trade ListObjects PreTradeTable On
  • 如何在 git 中强制执行作者/提交者身份验证?

    目前我们的项目中使用git进行版本控制 开发环境是内网 带有AD的Windows服务器 无法访问Internet 有没有办法配置 git 以使用作者和提交者的开发者域登录名 我们希望阻止开发人员自己提供这些信息 我在谷歌搜索这个问题时发现了
  • iPhone中非系统字体的名称

    我想向我的 iPhone iPad 应用程序添加非系统字体 我已将字体文件添加到项目中 并将字体添加到UIAppFontsinfo plist 的属性 加载我正在使用的字体fontWithName of UIFont 但是name字体的名称
  • 使用 nvd3 库显示单系列多条形图

    Does anyone know how I would go making a multi bar graph to be single series In a working example that i ve seen of how
  • C:为什么我们要包含声明但不定义的头文件?

    在较高的层面上 我知道我们使用 include使其他文件中的代码可用于当前文件的语句 但我不明白为什么我们要包含一个头文件 其中包含声明但没有定义 也许我需要更多地了解编译 链接过程才能完全理解其机制 但是是否有一个我一开始就未能掌握的高级
  • ASP.Net Web API OData - 消费者可以自由地查询他们想要的任何内容?

    我刚刚阅读了有关 OData 查询的 ASP Net Web API 支持的内容 并且在协调查询过滤的外部暴露方面遇到了麻烦 这本质上为集成商提供了向数据库抛出任意查询过滤器的能力 而不考虑最佳查询计划 不应查询的字段等等 如何清理 ODa
  • 截断小数不四舍五入[重复]

    这个问题在这里已经有答案了 可能的重复 c 如何将小数值四舍五入到小数点后两位 用于页面上的输出 我想像下面这样截断小数 i e 2 22939393 gt 2 229 2 22977777 gt 2 229 您可以使用数学轮 decima
  • 角度 $interval 在超过“count”参数后是否会自行取消?

    关于 Angular 中的 interval 服务的快速问题 查看文档 间隔 它们警告您手动取消间隔 但您可以选择在初始化时提供计数参数 一旦计时器 滴答作响 超过了分配的计数 它会自行取消还是只是停止调用该函数并在后台继续运行 TL 博士
  • 带有深思熟虑的冠层的 scipy

    我正在评估 Enthought 包 我安装了32位canopy 从下载https www enthought com downloads 在Ubuntu中 sudo bash canopy 1 0 1 rh5 32 sh 经过测试我没有看到
  • Symfony 在预持久上将数据添加到对象

    我有一个用于创建文档的表格 一方面 我可以添加名称和描述 在旁边我可以选择一个或多个机构创建的文档属于谁 每个机构被分配一个specific市场 一共有7个市场 所以一个市场可以有多个代理机构 但一个代理机构只能属于一个市场 我想要实现的是