更新多对多关联原则2

2024-03-13

有什么解决方案可以自动执行此操作吗?

我的两个实体:

class User
{
    /* *
    * @ManyToMany(targetEntity="Product", inversedBy="users")
    * @JoinTable(name="user_product",
    *  joinColumns={@JoinColumn(name="user_id", referencedColumnName="idUser")},
    * inverseJoinColumns={@JoinColumn(name="product_id", referencedColumnName="idProduct")}
    * 
    * )
    */
protected $products;
}

class Product {
    /**
    * @ManyToMany(targetEntity="User", mappedBy="products")
    */
protected $users;
}

User实体存在两个Products已经关联的 ID(1, 2):

$user = $entityManager->find('User', 1);

该数组来自新的视图Products要插入、删除的数据或者已经在列表中的数据不执行任何操作:

$array = array(1, 3, 4);

在这种情况下:

1 = Already in association with User (do nothing)
2 = not in array and should be deleted
3 = should be inserted
4 = should be inserted

在doctrine2中如何做到这一点?是否有一个合并功能可以自动执行或我应该手动执行?


考虑下面的代码

$user = $entityManager->find('User', 1);
$products = array();

foreach(array(1, 3, 4) as $product_id) {
    $products[$product_id] = $entityManager->getReference('MyBundle\Entity\Product', $product_id);
}

$user->setProducts($products);    
$entityManager->persist($user);
$entityManager->flush();

And setProducts定义为

function setProducts($products) {
  $this->products = new ArrayCollection($products);
}

在这种情况下,原则将删除所有用户的产品关联,然后插入从视图传入的每个产品关联。

我在我的系统上测试了这个visit实体与许多相关联visit_tag实体。请注意,教义删除了所有visit_tag给定的关联visit下面的探查器屏幕截图中的对象,然后创建每个对象。

为了使学说仅根据需要删除/插入关联,您必须手动合并现有的$user->products ArrayCollection而不是像上面那样覆盖它。您可以使用以下方法有效地做到这一点索引关联 http://doctrine-orm.readthedocs.org/en/latest/tutorials/working-with-indexed-associations.html通过indexBy注释,它允许您在恒定时间内通过唯一键(即产品 ID)搜索/添加/删除关联。

class User
{
   /**
    * @ManyToMany(targetEntity="Product", inversedBy="users", indexBy="id")
    * @JoinTable(name="user_product",
    *  joinColumns={@JoinColumn(name="user_id", referencedColumnName="idUser")},
    * inverseJoinColumns={@JoinColumn(name="product_id", referencedColumnName="idProduct")}
    * )
    */
    protected $products;

    public function setProducts($products) {
        foreach($this->products as $id => $product) {
            if(!isset($products[$id])) {
                //remove from old because it doesn't exist in new
                $this->products->remove($id);
            }
            else {
                //the product already exists do not overwrite
                unset($products[$id]);
            }
        }

        //add products that exist in new but not in old
        foreach($products as $id => $product) {
            $this->products[$id] = $product;
        }    
    }
}

现在,探查器显示该学说仅删除特定关联(而不是全部)并且仅插入新关联。

但是,为了执行手动合并原则,请查询数据库中的所有关联,否则您不必这样做。简而言之:

Method 1

  1. 删除所有关联
  2. 插入从视图传入的所有关联

Method 2

  1. 选择所有协会
  2. 仅删除那些不再存在的关联
  3. 仅插入视图中以前不存在的关联

当更改的关联数与关联总数相比相对较小时,方法 2 更好。然而,如果您要改变大部分关联,方法 1 似乎是最佳选择。

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

更新多对多关联原则2 的相关文章

  • Laravel Auth:attempt() 不会持久登录

    我在网上找到了许多有类似问题的资源 但似乎没有一个解决方案可以解决我的问题 当我使用以下代码登录用户时 一切看起来都很好 email Input get email password Input get password if Auth a
  • Arrayadapter.getcount 空点异常

    我得到以下堆栈跟踪 下面是完整的副本 这几乎没有或根本没有表明大型应用程序中出现错误时的位置 并且用户反馈除了 崩溃 之外什么也没有 我能做些什么来进一步查明这一点吗 java lang NullPointerException at an
  • Symfony2:为什么请求传递到受 Symfony2 中 AppCache 影响的 Kernel.Terminate EventListener

    在我的 Symfony2 2 应用程序中 我使用 onKernelTerminate EventListener 以便我可以在渲染响应后进行一些 繁重 处理 以便用户收到更快的响应时间 在我的控制器中 我在请求上设置了一个属性 以便当事件侦
  • 合并 JavaScript 数组中的重复项

    我有一个愚蠢的问题 乍一看似乎很容易解决 但结果却很棘手 我有一个对象数组 每个对象都有两个属性 id 和 value id 2 value 10 id 4 value 3 id 2 value 2 id 1 value 15 我想编写一个
  • 选择一组数字以达到最小总数的算法

    给定 一组数字n 1 n 2 n 3 n x 还有一个数字M 我想找到最好的组合 n a n b n c n gt M 该组合应达到达到或超过 M 所需的最小值 没有其他组合可以提供更好的结果 将在 PHP 中执行此操作 因此可以使用 PH
  • php中的条件格式化html表与时间戳比较

    echo table style width 100 tr echo td Order td echo td Destination td echo td Location td echo td Status td echo td Time
  • 如何隐藏 URL 中的锚标记

    如何隐藏地址栏中以下链接 href 的哈希值 a href index php dev name 所以它会将我重定向到index php dev name 但我希望地址栏只显示index php 您可以使用 Javascript oncli
  • 如何关闭未关闭的 HTML 标签?

    每当我们从数据库或类似来源获取一些经过编辑的用户输入内容时 我们可能会检索仅包含开始标记但不包含结束标记的部分 这可能会妨碍网站当前的布局 有客户端或服务器端的方法来解决这个问题吗 找到了一个很好的答案 使用 PHP 5 并使用 DOMDo
  • Turbo C 阵列问题

    我只是想问一些关于我的代码的事情 define LIM 40 main int day 0 float temp LIM clrscr do printf Enter temperature for day d day scanf f te
  • 获取字符串中的最后一个整数

    我需要隔离包含多个整数的字符串中最新出现的整数 我怎样才能得到23代替1 for lastnum1 text 1 out of 23 lastnum1 this gt getEval eregi replace out of text 你可
  • 检查 PHP 中的字符串长度

    我有一个长度为 141 个字符的字符串 使用下面的代码我有一个if如果字符串大于或小于 140 则语句返回一条消息 libxml use internal errors TRUE dom new DOMDocument dom gt loa
  • WordPress 包含 SVG 文件错误

    我使用 PHP 和 WordPress 在本地主机上 我可以毫无问题地包含 SVG 文件 但在实时服务器上 我尝试包含一个 SVG 文件以便能够使用 CSS 对其进行样式设置 我收到此错误消息 Parse error syntax erro
  • 对 SimpleXML 数据进行排序和分组

    我正在对 XML 文件中的出版物数据进行排序和分组 我目前使用的方法效果很好大部分情况下 尽管我觉得有一种更有效的方法来完成我想要完成的任务 以下是目标节点的示例
  • PHP 扩展开发入门 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 请推荐有关 PHP 低 级 modules 编程接口的帮助文章或教程 搜索我的书签 我发现的唯一链接是
  • 按范围迭代数组

    我有一个数组 1 2 3 4 5 6 100 我希望将此数组迭代 5 次 具体来说 取数组的前 5 个数字并获取平均值 继续处理接下来的 5 个数字并获取平均值 依此类推 我尝试过多种方法 例如Dequeue和 for 循环但未能获得所需的
  • PHP 中的引用

    我正在编写一个自定义博客引擎 并且希望拥有类似于 Wordpress 的引用 我可以查看 WordPress 源代码 但我真的更喜欢某种教程 但到目前为止我还没有找到 有没有关于在 PHP5 中实现 trackbacks 或 pingbac
  • 我可以在 PHP 会话变量中安全地存储用户名和密码吗?

    我想在 REST api 之上制作一个轻量级的 web 应用程序 用户只需进行一次身份验证 从那时起 所有针对 web api 的请求都希望通过以某种方式保持用户名和密码有效来完成 我已经做了一个工作原型我在哪里将用户名和密码存储在会话变量
  • 如何从 Laravel 执行存储过程

    我需要在表单提交数据后执行存储过程 我让存储过程按照我想要的方式工作 并且我的表单正常工作 我只是不知道从 laravel 5 执行 sp 的语句 它应该是这样的 执行 my stored procedure 但我似乎在网上找不到类似的东西
  • 反向引用在 PHP 中不起作用

    最近我一直在研究 更多的是在实践中说实话 正则表达式 我注意到他的力量 我提出的这个要求 link https stackoverflow com questions 30380397 take the text up to a speci
  • 如何使用 php 在 sql 查询中转义引号?

    我有一个疑问 sql SELECT CustomerID FROM tblCustomer WHERE EmailAddress addslashes POST username AND Password addslashes POST p

随机推荐

  • R函数将对象转换为代码

    我正在 R 中寻找一个函数 它将对象转换为可用于创建该对象的副本的代码 像这样的事情 gt myObject c 1 2 3 gt magicFunction myObject 1 c 1 2 3 我认为这个功能是存在的 但我找不到它 非常
  • 使用 Nginx 服务器设置 Symfony

    我的项目需要使用 Nginx 服务器设置 symfony 我之前曾将 Symfony 与 Apache 一起使用 目前我已按照此处提到的步骤进行操作 但不知何故它运行不正常 Update nginx wiki 现在包含symfony 1 4
  • Javascript eval() 和附加脚本标签之间的区别

    我想知道是否有人可以解释使用 Javascript 的 eval 和另一种方法之间的区别 例如使用 JQuery 创建脚本标签 然后将该元素附加到页面 eval somecode vs appendTo head 不确定这是否相关 但上下文
  • 如何让 Ohai 插件生成 ['etc']['passwd']?

    我已将 Chef 客户端从14 0 to 15 3 14但每当我在我的节点 macOS Mojave 上执行 Chef client 时 就会出现问题 客户端输出是 undefined method for nil NilClass Coo
  • CUDA:同步线程

    几乎在我读到的有关 CUDA 编程的任何地方都提到了 warp 中的所有线程都执行相同操作的重要性 在我的代码中 我遇到了无法避免某种条件的情况 它看起来像这样 some math code calculating d1 d2 if d1
  • 编译启用位码的 iOS 库

    我需要发布一个启用了位码的框架 但这很麻烦 我将项目设置中的 启用位码 设置为 是 它可以为真实设备和模拟器干净地构建 我想测试这个库 所以我将它集成到我为此目的创建的新应用程序中 但现在它只为模拟器构建 当我尝试为真实设备构建时 我得到
  • 插入包含撇号(单引号)的数据时MySQL出错?

    当我插入查询包含引号时 例如Kellog s 插入记录失败 错误信息 您的 SQL 语法有错误 检查手册 与您的 MySQL 服务器版本相对应 以便使用正确的语法 靠近 s 玉米片 170g 15 90 15 90 14 10 at 第 1
  • 如何在调试模式下运行 Apache Tomcat 8?

    我正在尝试在调试模式下运行 Apache Tomcat 8 0 21 当我发出命令时 sh catalina sh jpda start 它给出了这个错误 错误信息 错误 无法两次加载此 JVM TI 代理 请检查您的 java 命令 重复
  • SyncAdapter periodsync() 未触发

    我正在尝试弄清楚syncAdapter是如何工作的 我使用sampleSync Adapter作为示例 起点 并基于它进行了我的第一次测试 唯一的区别是我不使用默认的联系人提供程序 但我需要自己的联系人提供程序之一 此方法与 SampleS
  • 部分重写子类中的虚拟自动属性

    是时候回答我刚刚遇到的理论问题了 以下代码有效并可编译 public class Parent public virtual object TestProperty get set public class Child Parent pri
  • 访问服务时在 Docker Swarm 1.12 中记录客户端的“真实”IP 地址

    我有 nginx 容器作为服务在用户创建的覆盖网络内的 Docker Swarm 中运行 两者都是用以下内容创建的 docker network create driver overlay proxy docker service crea
  • 是什么导致 BigDecimal.divide 出现“非终止十进制扩展”异常? [复制]

    这个问题在这里已经有答案了 我以前使用过 BigDecimals 但不经常使用 今天早上我正在做一些事情 但我不断收到以下异常 Exception in thread main java lang ArithmeticException N
  • 使用 helix 工具包创建可点击的对象

    我在 Helix Toolkit 上找到了一个例子 它被称为 ScatterPlot 它非常接近我真正需要的 但我找不到任何关于如何将 onclick 事件侦听器添加到创建的对象 在本例中为球体 的信息 这会将球体添加到 游乐场 scatt
  • jdk 1.5 中不存在 javax.swing.grouplayout

    我用netbeans开发了一个java应用程序 它使用jdk 1 6 效果很好 但现在的要求是我需要从另一台没有 netbeans 且使用 jdk 1 5 的计算机中的 java 文件构建应用程序的 jar 我无法将该机器升级到jdk 1
  • 使用宏合并 CSV 文件

    知道如何合并一个文件夹中的 csv 文件吗 我有许多具有相同结构 列数和标题 的 csv 文件 我需要将它们的内容合并到一张纸中 我知道这并不难 但是 当我从一个表添加内容时 我需要添加带有复制此数据的表名称的新列 有什么帮助吗 谢谢你 有
  • 通过构造函数传递和存储 const 引用?

    这可能是一个简单的问题 但我一直坚持下去 我试图通过它的构造函数将一个对象从 ObjectA 传递到 ObjectB 它是 ObjectA 的成员 但是 我不想传递值 而是只想传递 const 引用并无限期地存储该引用 问题是我不知道该怎么
  • 正则表达式导致“分隔符不能是字母数字或反斜杠”[重复]

    这个问题在这里已经有答案了 我有这个代码 function a menu item remove link pattern class
  • 初始化张量

    tf coo tf SparseTensor indices np array 0 0 0 1 1 2 3 9 1 4 9 9 9 9 9 9 T values 1 2 3 5 1 1 1 1 shape 10 10 我收到错误消息 Inv
  • vuejs 条件包装器

    在我的 nativescript vue 应用程序中 我有一个名为 profileForm 的单个文件组件 我想以两种方式使用该组件 如果用户登录 我希望将该组件作为布局组件的插槽来编辑配置文件 否则我想要的是作为注册表 我不想创建额外的组
  • 更新多对多关联原则2

    有什么解决方案可以自动执行此操作吗 我的两个实体 class User ManyToMany targetEntity Product inversedBy users JoinTable name user product joinCol