多重坚持 Symfony 3 Doctrine
Multiple persist in Symfony 3 Doctrine
我有一个包含 3 个表的数据库,Equipment、transaction 和 transactionReceive。未来会有多个transactionXYZ,每种交易一个。我使用了连接继承 link transactionReceive with transaction。我还在设备和交易之间使用多对一关联,因为一件设备可以有多个交易。
我目前正在努力添加一件设备。这是一个两步过程。这应该:
1:制作装备
2:创建transaction/transactionReceive
我的问题是,当我尝试设置 equipmentId 以保留事务时,它会抛出一个异常,提示它为空。
我的代码如下:
$em->persist($equipmentData);
$em->flush();
$trans = new TransactionReceive();
$trans->setEquipmentId($equipmentData->getId());
//Here I set all transactions info
$em->persist($trans);
$em->flush();
谢谢
编辑:
显然我的问题与 ManyToOne 关联的插入有关。我注意到它是因为即使我在交易中硬编码 equipmentId 的值,我也会得到同样的错误。
编辑 2:
交易实体
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Transaction
*
* @ORM\Table(name="transaction")
* @ORM\Entity(repositoryClass="AppBundle\Repository\TransactionRepository")
*
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="transactionType", type="string")
* ORM\@DiscriminatorMap({
* "receive" = "TransactionReceive",
* "changeout" = "TransactionChangeoutWheelset",
* })
*/
class Transaction
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var int
* @ORM\ManyToOne(targetEntity="Equipment")
* @ORM\Column(name="equipmentId", type="integer")
*/
private $equipmentId;
/**
* @return int
*/
public function getequipmentId()
{
return $this->equipmentId;
}
/**
* @param int $equipmentId
*
* @return self
*/
public function setEquipmentId($equipmentId)
{
$this->equipmentId= $equipmentId;
return $this;
}
// Other attributes, getters and setters
交易接收实体
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\Transaction;
/**
* TransactionReceive
*
* @ORM\Table(name="transaction_receive")
* @ORM\Entity(repositoryClass="AppBundle\Repository\TransactionReceiveRepository")
*/
class TransactionReceive extends Transaction
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var int
*
* @ORM\Column(name="gsThickness", type="integer")
*/
private $gsThickness;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set gsThickness
*
* @param integer $gsThickness
*
* @return TransactionReceive
*/
public function setGsThickness($gsThickness)
{
$this->gsThickness = $gsThickness;
return $this;
}
/**
* Get gsThickness
*
* @return int
*/
public function getGsThickness()
{
return $this->gsThickness;
}
}
由于你的equipementId
属性是一个外键,你需要将它设置为一个对象设备,而不仅仅是它的Id。
将行 $trans->setEquipmentId($equipmentData->getId());
替换为
$trans->setEquipmentId($equipmentData);
应该能帮到你。
我有一个包含 3 个表的数据库,Equipment、transaction 和 transactionReceive。未来会有多个transactionXYZ,每种交易一个。我使用了连接继承 link transactionReceive with transaction。我还在设备和交易之间使用多对一关联,因为一件设备可以有多个交易。
我目前正在努力添加一件设备。这是一个两步过程。这应该: 1:制作装备 2:创建transaction/transactionReceive
我的问题是,当我尝试设置 equipmentId 以保留事务时,它会抛出一个异常,提示它为空。
我的代码如下:
$em->persist($equipmentData);
$em->flush();
$trans = new TransactionReceive();
$trans->setEquipmentId($equipmentData->getId());
//Here I set all transactions info
$em->persist($trans);
$em->flush();
谢谢
编辑: 显然我的问题与 ManyToOne 关联的插入有关。我注意到它是因为即使我在交易中硬编码 equipmentId 的值,我也会得到同样的错误。
编辑 2: 交易实体
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Transaction
*
* @ORM\Table(name="transaction")
* @ORM\Entity(repositoryClass="AppBundle\Repository\TransactionRepository")
*
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="transactionType", type="string")
* ORM\@DiscriminatorMap({
* "receive" = "TransactionReceive",
* "changeout" = "TransactionChangeoutWheelset",
* })
*/
class Transaction
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var int
* @ORM\ManyToOne(targetEntity="Equipment")
* @ORM\Column(name="equipmentId", type="integer")
*/
private $equipmentId;
/**
* @return int
*/
public function getequipmentId()
{
return $this->equipmentId;
}
/**
* @param int $equipmentId
*
* @return self
*/
public function setEquipmentId($equipmentId)
{
$this->equipmentId= $equipmentId;
return $this;
}
// Other attributes, getters and setters
交易接收实体
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\Transaction;
/**
* TransactionReceive
*
* @ORM\Table(name="transaction_receive")
* @ORM\Entity(repositoryClass="AppBundle\Repository\TransactionReceiveRepository")
*/
class TransactionReceive extends Transaction
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var int
*
* @ORM\Column(name="gsThickness", type="integer")
*/
private $gsThickness;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set gsThickness
*
* @param integer $gsThickness
*
* @return TransactionReceive
*/
public function setGsThickness($gsThickness)
{
$this->gsThickness = $gsThickness;
return $this;
}
/**
* Get gsThickness
*
* @return int
*/
public function getGsThickness()
{
return $this->gsThickness;
}
}
由于你的equipementId
属性是一个外键,你需要将它设置为一个对象设备,而不仅仅是它的Id。
将行 $trans->setEquipmentId($equipmentData->getId());
替换为
$trans->setEquipmentId($equipmentData);
应该能帮到你。