在 Symfony 中正确保存相关实体(外键)

Posted

技术标签:

【中文标题】在 Symfony 中正确保存相关实体(外键)【英文标题】:Persisting related entities in Symfony correctly (Foreign Keys) 【发布时间】:2014-05-20 03:35:01 【问题描述】:

我有两个对象:Company 和 Location

一家公司可以有许多地点(比如代表他们在其中设有办事处的每个城市)。

我已经设置模型/实体来表示这种关系:

Location: id, address, company
Company: id, name, locations

所以我在公司上有自动生成的功能:

public function addLocation(Location $locations)

    $this->locations[] = $locations;
    return $this;

我的问题是,如果我想将新公司和新地点都添加到我的数据库中 - 我可以通过添加到公司中的地点来完成吗? Symfony 会足够聪明地找出所有外键 ID 吗?

说我要创建:

$company = new Company();
$company->setName('NEW COMPANY');

$location1 = new Location();
$location1.setAddress('123 Fake St');
// $location1.setCompany($company) // Is this required?

$location2 = new Location();
$location2.setAddress('456 Test Hwy');
// $location2.setCompany($company) // Is this required?

$company->addLocation($location1);
$company->addLocation($location2);

我很好奇这是如何工作的,或者我是否找错了树,应该只在一次交易中添加公司,然后再添加位置。任何想法表示赞赏 - 谢谢。

【问题讨论】:

【参考方案1】:

你可以这样做:

<?php

/** @Entity */
class Company

    // ...

    /**
     * @ManyToMany(targetEntity="Location", inversedBy="companies")
     * @JoinTable(name="company_location")
     */
    private $locations;

    public function __construct() 
        $this->locations = new \Doctrine\Common\Collections\ArrayCollection();
    

    // ...


/** @Entity */
class Location

    // ...
    /**
     * @ManyToMany(targetEntity="Company", mappedBy="locations")
     */
    private $companies;

    public function __construct() 
        $this->companies = new \Doctrine\Common\Collections\ArrayCollection();
    

    // ...

我认为您正在寻找级联持久化,请在此处阅读更多信息:Doctrine 2 ManyToMany cascade

【讨论】:

是的。级联/持久是我需要添加的注释 - 然后它起作用了:) 谢谢

以上是关于在 Symfony 中正确保存相关实体(外键)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中正确保存多个文件?

如何在核心数据中正确保存可转换对象?

无法在数据库中正确保存不同语言的地址

网页无法在谷歌浏览器中正确保存

奇怪的 MSC 8.0 错误:“ESP 的值没有在函数调用中正确保存......”

从Blob中正确保存C#中的.mp4文件[关闭]