在我的代码中,我有一个名为Squares的表。 Square有很多资产。 Squares有一个名为msid的列,它是一个正方形ID。
在我的Assets表中,我有一个名为msid的字段。这是它所属的Square的msid。
我试图建立一对多/多对一的关系,但它只是不起作用。我不知道它是什么,我对symfony和Doctrine很新,所以如果你想到一个解决方案,请不要跳过步骤。
在此先感谢,这让我快速离开这次迁移。
编辑:我需要提一下,我没有生成新架构。我正在将当前正在生产的模式迁移到ORM。
Assets.php
SummaryWriter
Assets.SQL
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Assets
*
* @ORM\Table(name="assets")
* @ORM\Entity
*/
class Assets
{
/**
* @ORM\ManyToOne(targetEntity="Squares", inversedBy="assets")
*/
private $square;
/**
* @var integer
*
* @ORM\Column(name="msid", type="integer", nullable=false)
*/
private $msid;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=64, nullable=false)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="type", type="string", length=32, nullable=false)
*/
private $type;
/**
* @var string
*
* @ORM\Column(name="data", type="string", length=4096, nullable=false)
*/
private $data;
/**
* @var integer
*
* @ORM\Column(name="assetid", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $assetid;
/**
* Set msid
*
* @param integer $msid
*
* @return Assets
*/
public function setMsid($msid)
{
$this->msid = $msid;
return $this;
}
/**
* Get msid
*
* @return integer
*/
public function getMsid()
{
return $this->msid;
}
/**
* Set name
*
* @param string $name
*
* @return Assets
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set type
*
* @param string $type
*
* @return Assets
*/
public function setType($type)
{
$this->type = $type;
return $this;
}
/**
* Get type
*
* @return string
*/
public function getType()
{
return $this->type;
}
/**
* Set data
*
* @param string $data
*
* @return Assets
*/
public function setData($data)
{
$this->data = $data;
return $this;
}
/**
* Get data
*
* @return string
*/
public function getData()
{
return $this->data;
}
/**
* Get assetid
*
* @return integer
*/
public function getAssetid()
{
return $this->assetid;
}
}
Squares.php
CREATE TABLE IF NOT EXISTS `assets` (
`assetid` int(5) NOT NULL AUTO_INCREMENT,
`msid` int(5) NOT NULL,
`name` varchar(64) NOT NULL,
`type` varchar(32) NOT NULL,
`data` varchar(4096) NOT NULL,
PRIMARY KEY (`assetid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8092 ;
Squares SQL
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Squares
*
* @ORM\Table(name="squares")
* @ORM\Entity(repositoryClass="AppBundle\Repository\SquaresRepository")
*/
class Squares
{
/**
* @var integer
*
* @ORM\Column(name="userid", type="integer", nullable=false)
*/
private $userid;
/**
* @var boolean
*
* @ORM\Column(name="squaretype", type="boolean", nullable=false)
*/
private $squaretype;
/**
* @var \DateTime
*
* @ORM\Column(name="published", type="datetime", nullable=false)
*/
private $published = 'CURRENT_TIMESTAMP';
/**
* @var integer
*
* @ORM\Column(name="msid", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $msid;
/**
* @ORM\OneToMany(targetEntity="Assets", mappedBy="square")
*/
private $assets;
public function __construct()
{
$this->assets = new ArrayCollection();
}
// other getters setters here ...
/**
* Get assets
*
* @return ArrayCollection
*/
public function getAssets()
{
return $this->assets;
}
/**
* Set assets
*
* @param ArrayCollection $assets
*
* @return Squares
*/
public function setAssets($assets)
{
$this->assets = $assets;
return $this;
}
答案 0 :(得分:1)
我已经使用official example并根据您的命名进行了调整:
/** @Entity */
class Square
{
// ...
/**
* @OneToMany(targetEntity="Asset", mappedBy="square")
*/
private $assets;
// ...
public function __construct() {
$this->assets = new ArrayCollection();
}
}
/** @Entity */
class Asset
{
// ...
/**
* @ManyToOne(targetEntity="Square", inversedBy="assets")
*/
private $square;
// ...
}
查看mappedBy
和inversedBy
选项如何指向相关实体的字段名称,并注意关联如何根本不引用实体的实际ID。如果要控制将为Asset实体生成的表中的外键列的名称,可以添加@JoinColumn注释,如官方示例中所示。但我建议你先试试一下,然后观察一下你的教义。
答案 1 :(得分:0)
这个问题(我认为)源于我从现有数据库生成* .orm.xml文件并尝试自动迁移的事实。虽然这些.orm.xml文件存在,但我无法改变任何东西。这些文件位于AppBundle / Resources / config / doctrine中......一旦我删除了这些文件,一切都按预期工作。
答案 2 :(得分:0)
首先,您应该查看解释它的Doctrine website。
其次,您应该将您的类命名为单个对象,这意味着将它们命名为Square而不是Squares和Asset而不是Assets。
您可以省略msid列,因为Doctrine通过使用您放置映射/ reversby属性的列来为您进行映射。