教义:如何取消设置(SET NULL)OneToMany关系

2024-02-29

这是一个非常非常简单的行为,但我却找不到用教义来实现的方法。我将解释它仅用两个实体来降低复杂性。

有两个相关的实体(作者和书籍),例如“一位作者拥有零本或更多书籍”和“一本书籍由零位或一位作者拥有”,我试图取消作者与其一本书籍之间的关系(来自作者方),期望数据库中的 book.author_id 字段设置为 null。

实体定义如下:

Author

/**
 * Author
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Poc\PocBundle\Entity\AuthorRepository")
 */
class Author
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Author
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @ORM\OneToMany(targetEntity="Book", mappedBy="author", cascade={"persist", "remove"})
     */
    private $books;

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

    /**
     * Add books
     *
     * @param \Poc\PocBundle\Entity\Book $books
     * @return Author
     */
    public function addBook(\Poc\PocBundle\Entity\Book $books)
    {
        $this->books[] = $books;

        return $this;
    }

    /**
     * Remove books
     *
     * @param \Poc\PocBundle\Entity\Book $books
     */
    public function removeBook(\Poc\PocBundle\Entity\Book $books)
    {
        $this->books->removeElement($books);
    }

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

Book

/**
 * Book
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Poc\PocBundle\Entity\BookRepository")
 */
class Book
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Book
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @ORM\ManyToOne(targetEntity="Author", inversedBy="books")
     * @ORM\JoinColumn(name="author_id", referencedColumnName="id", onDelete="SET NULL")
     */
     protected $author;


    /**
     * Set author
     *
     * @param \Poc\PocBundle\Entity\Author $author
     * @return Book
     */
    public function setAuthor(\Poc\PocBundle\Entity\Author $author = null)
    {
        $this->author = $author;

        return $this;
    }

    /**
     * Get author
     *
     * @return \Poc\PocBundle\Entity\Author 
     */
    public function getAuthor()
    {
        return $this->author;
    }
}

在主控制器中我执行以下操作。

  • 检索作者

  • 检索该作者拥有的一本书

  • 从作者那里删除书籍

  • 坚持作者并刷新

  • 取回书本

  • 求作者...

而作者仍然是一样的。在数据库中,该记录的字段book.author_id并没有像预期那样设置为NULL,但仍然与作者相关。

控制器代码:

    $Book = $this->getDoctrine()
        ->getRepository('PocPocBundle:Book')
        ->find('1');
    $Author = $this->getDoctrine()
        ->getRepository('PocPocBundle:Author')
        ->find('1');

    $Author->removeBook($Book);


    $em = $this->getDoctrine()->getManager();
    $em->persist($Author);
    $em->flush();

    echo "<pre>";
    $Book = $this->getDoctrine()
        ->getRepository('PocPocBundle:Book')
        ->find('1');
    \Doctrine\Common\Util\Debug::dump($Book);

    die;

...以及输出

object(stdClass)[286]
      public '__CLASS__' => string 'Poc\PocBundle\Entity\Book' (length=25)
      public 'id' => int 1
      public 'name' => string 'El Quijote' (length=10)
      public 'author' => 
        object(stdClass)[293]
          public '__CLASS__' => string 'Poc\PocBundle\Entity\Author' (length=27)
          public '__IS_PROXY__' => boolean true
          public '__PROXY_INITIALIZED__' => boolean true
          public 'id' => int 1
          public 'name' => string 'Cervantes' (length=9)
          public 'books' => string 'Array(1)' (length=8)

在实体 Book (id=1) 的输出中我们可以看到这本书仍然与作者相关。

当然,我遗漏了一些东西,但我找不到差距在哪里。


如果要删除 Author 和 Book 实体之间的关联,您应该删除 Book 实体中的关联,并使用 $em->flush() 保留它。 $em->persist($entity) 不用于实体删除。删除 PHP 对象中的关联并通过 ORM 刷新它们,删除数据库中的关联。

只需在 Doctrine 文档中查看即可:

http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#removing-associations http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#removing-associations

我希望它对你有用。干杯!

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

教义:如何取消设置(SET NULL)OneToMany关系 的相关文章

随机推荐

  • 如何在我的 App.js 视图中导入和使用此文件

    我想将其导入到我的 React Native 项目 App Js vue 中 我尝试了很多方法 但它不起作用 我的意思是我想在我的视图中渲染它 我如何导入并在我的 Appjs 中显示此文件 谁能帮助我 这对我来说非常重要 这是我的代码 im
  • UIScrollView contentInset 属性有什么用?

    有人可以向我解释一下是什么吗contentInset财产在一个UIScrollView实例是用来做什么的 也许提供一个例子 它设置内容视图和封闭滚动视图之间的插图距离 Obj C aScrollView contentInset UIEdg
  • 解决 celerybeat 的单点故障问题

    我正在寻找推荐的解决方案来解决 celerybeat 成为 celery rabbitmq 部署的单点故障的问题 到目前为止 通过搜索网络 我没有找到任何有意义的东西 就我而言 定时调度程序每天启动一次可以运行半天或更长时间的一系列作业 由
  • contentView 在 iOS 6 UITableViewCell 原型单元格中不缩进

    我正在配置自定义UITableViewCell在故事板中使用原型单元 然而 所有的UILabels 和其他 UI 元素 似乎没有添加到单元格的contentView 而不是添加到UITableViewCell直接查看 当单元格进入编辑模式时
  • Chrome iframe 父级未定义

    我有这个 Gmail 脚本 它运行在canvas frame iframe 我想使用父文档的句柄parent document 但在 Chrome 中告诉我它是未定义的 在 Firefox 中工作正常 但在 Chrome 上就崩溃了 那么
  • 在SceneKit中,SCNLightTypeAmbient类型的SCNLight是否会忽略categoryBitMask参数?

    看来是啊 这里 categoryBitMask 被忽略 ambientLight SCNLight light ambientLight color UIColor colorWithRed 0 994 green 0 715 blue 0
  • iTunes 有哪些脚本目标?

    苹果有一个很好的文档技术问答页面 https developer apple com library mac qa qa1802 index html用于实现 Mail app 的脚本目标 然而 尽管脚本目标也适用于 iTunes 但没有可
  • 静态方法和扩展方法同名

    我创建了扩展方法 public static class XDecimal public static decimal Floor this decimal value int precision decimal step decimal
  • Vue2 在通过 Axios 接收的列表中搜索

    由于过滤比 Vue 1 中的过滤要复杂得多 所以我有一个问题 这是我的组件 其中显示了羊列表 并提供了搜索 过滤名称或家族的选项 但我不知道如何实现这一目标
  • 如何将配置变量发送到 py.test 测试?

    我有一个测试套件需要与多个后端一起运行 但这不是一个简单的参数化测试 因为它适用于整个套件 多个文件 模块 我可以通过环境控制运行 但我想知道 py test 是否有更清晰的方式来表达这一点 也就是说 我正在寻找这样的东西 py test
  • 如何将 hasOne 关系与嵌入的always关系建立起来

    EmberJS 在早期版本中删除了 hasOne 在我想要 hasOne 的地方创建这样的嵌套对象关系的方法是什么 已经删除了 hasOne 以支持 ownTo 任何人都可以分享一下如何在嵌套 JSON 之间编写 embedded alwa
  • 如何将 C++ 静态库链接到 C 程序?

    我有以下 C 程序 Client h ifndef Client Client h define Client Client h include Client h class Client public void f1 void f2 en
  • Vim 中切换回上一个窗口的快捷方式?

    Ctrlw1w switches to the first window 如果目前我经常在几个窗口中的两个中进行编辑 那么切换回最后一个活动窗口的快捷方式将是完美的 有这样的捷径吗 你试过了吗
  • javascript 动态 HTML 表格行导致问题

    我有一个select option在选择其中我创建一个 HTML 表 因为我根据所选选项从后端调用数据 所以创建的表行是动态的 我正在做的是 在更改选择选项时 我正在创建 HTML 表格行 这些行是动态的并且由输入字段组成 ItemName
  • “mod”Haskell 上的语法错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在关注 haskell 教程 http www seas upenn edu cis194 lectures 01 intro
  • Autohotkey 脚本使用命令行参数运行程序

    我正在使用自动热键来自动化一些手动过程 我必须运行一个接受几个命令行参数的java命令行程序 java 我想在自动化中执行一些预定义的任务后从 autohotkey 运行这个 java 程序 我该怎么做 我认为这就是您正在寻找的 在此示例中
  • OAuth2 与 Spring Security - InsufficientAuthenticationException

    我目前正在开发一个涉及 Spring Security 针对 OAuth2 的项目 我们正在使用授权码流程 但是 当客户端点击 AuthorizationEndpoint oauth authorize 时 我们得到一个 Insuffici
  • 是否可以让 LaTeX 链接到图形的顶部而不是其标题?

    在我的 TeX 文件中 我有以下代码 begin figure H begin center includegraphics width 5in screens main png caption label fig MainScreen S
  • 如何在 Objective-c 中将数组声明为常量?

    以下代码给我错误 constants h extern NSArray const testArray constants m NSArray const testArray NSArray arrayWithObjects foo bar
  • 教义:如何取消设置(SET NULL)OneToMany关系

    这是一个非常非常简单的行为 但我却找不到用教义来实现的方法 我将解释它仅用两个实体来降低复杂性 有两个相关的实体 作者和书籍 例如 一位作者拥有零本或更多书籍 和 一本书籍由零位或一位作者拥有 我试图取消作者与其一本书籍之间的关系 来自作者