添加方法不能在多对多关系中工作

时间:2016-06-08 08:35:46

标签: doctrine-orm symfony

我在公交车和司机之间有这么多关系。

这是巴士实体:

/**
     * @var ArrayCollection<Driver> The driver of this bus.
     * @ORM\ManyToMany(targetEntity="Driver", inversedBy="bus" , cascade={"persist"})
     * @ORM\JoinTable(name="bus_driver")
     * @ORM\JoinColumn(name="driver_id", referencedColumnName="id")
     * */
    private $driver;

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


    public function addDriver($driver) {
        $this->driver[] = $driver;
        return $this;
    }

这是驱动程序实体:

/**
     * @var ArrayCollection<Bus> The buses of this driver
     * @ORM\ManyToMany(targetEntity="Bus", mappedBy="driver")
     * @ORM\JoinTable(name="bus_driver")
     * @ORM\JoinColumn(name="bus_id", referencedColumnName="id")
     */
    private $bus;

public function __construct() {
        $this->bus = new \Doctrine\Common\Collections\ArrayCollection();
    }
 public function addBus($bus) {
        $this->bus[] = $bus;
        $bus->addDriver($this);
        return $this;
    }

我的问题是,当我添加一个带驱动程序的总线时,关系会保持不变,但是当我添加一个总线驱动程序时却没有。它只适用于公交车。

3 个答案:

答案 0 :(得分:0)

请考虑将$ driver重命名为$ drivers,因为有多个驱动程序(总线相同 - &gt;总线)

然后你应该尝试:

@ORM \ ManyToMany(targetEntity =&#34; xxx&#34;,cascade = {&#34; persist&#34;})

更多详情:http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations

答案 1 :(得分:0)

更改这些(添加null并将其命名为'drivers'):

use Doctrine\Common\Collections\ArrayCollection;
...
private $drivers = null;

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

public function addDriver($driver) {
  $this->drivers[] = $driver;
  return $this;
}

另外,要从总线实体方面解决问题,您可能(但我不确定)需要进行此更改:

public function addDriver($driver) {
  $driver->addBus($this);
  $this->drivers[] = $driver;
  return $this;
}

尝试一下,因为我在ManyToOne关系中有类似的场景,我想知道上述改变是否有效。

答案 2 :(得分:0)

唯一的工作场景是我的时候:

驱动程序集合的setter。 addDriver方法。 removeDriver方法。

如果我删除了其中一个,那么addDriver甚至不会触发。