[英]One-to-Many Symfony Doctrine returns empty result
在我的代碼中,我有一個名為Squares的表。 廣場有很多資產。 Squares有一個稱為msid的列,它是Squares ID。
在我的資產表中,我有一個名為msid的字段。 這是它所屬的Square的msid。
我正在嘗試建立一對多/多對一關系,但這種方法不起作用。 我不知道它是什么,而且我對symfony和Doctrine還是陌生的,因此,如果您想到一種解決方案,請不要跳過步驟。
在此先感謝您,如此之快讓我無法進行遷移。
編輯:我需要提一下,我沒有生成新的架構。 我正在將當前生產中的模式遷移到ORM。
Assets.php
<?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;
}
}
資產SQL
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.php
<?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;
}
平方SQL
CREATE TABLE IF NOT EXISTS `squares` (
`msid` int(11) NOT NULL AUTO_INCREMENT,
`userid` int(5) NOT NULL,
`squaretype` tinyint(4) NOT NULL,
`published` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`package` text NOT NULL,
`counter` int(10) unsigned NOT NULL DEFAULT '0',
`firstname` varchar(20) NOT NULL,
`middlename` varchar(20) NOT NULL,
`lastname` varchar(20) NOT NULL,
`age` tinyint(1) DEFAULT NULL,
`dob` text NOT NULL,
`dod` text NOT NULL,
`city` varchar(32) NOT NULL,
`state` varchar(13) NOT NULL,
`zip` int(5) NOT NULL,
`sex` varchar(1) NOT NULL,
`bio` text NOT NULL,
`service` text NOT NULL,
`picture` int(11) DEFAULT NULL,
`video` text,
`videoexp` date DEFAULT NULL,
`videoReady` tinyint(1) NOT NULL,
`videoCounter` int(10) unsigned NOT NULL DEFAULT '0',
`vidIntro` text,
`vidMusic` text,
`vidBackground` text,
`dualfirst` varchar(20) NOT NULL,
`dualmiddle` varchar(20) NOT NULL,
`duallast` varchar(20) NOT NULL,
`dualdob` text NOT NULL,
`dualdod` text NOT NULL,
`dualpicture` int(11) DEFAULT NULL,
`couplesname` varchar(50) NOT NULL,
`birthday1` text,
`birthday2` text,
`visible` tinyint(4) NOT NULL DEFAULT '0',
`verified` tinyint(1) NOT NULL,
`fhName` varchar(256) NOT NULL,
`fhPhone` varchar(20) NOT NULL,
`fhLink` varchar(128) NOT NULL,
`clientid` int(4) unsigned zerofill NOT NULL,
PRIMARY KEY (`msid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10364 ;
我以官方示例為例,並對其進行了調整:
/** @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
選項如何指向相關實體的字段名稱,並注意關聯如何完全不引用實體的實際標識。 如果要控制將為Asset實體生成的表中的外鍵列的名稱,則可以添加@JoinColumn批注,如官方示例中所示。 但是我建議您一開始不嘗試它,然后觀察一下教義為您帶來了什么。
這個問題(我認為)源於我從現有數據庫生成* .orm.xml文件並試圖自動遷移的事實。 這些.orm.xml文件存在時,我無法更改任何內容。 這些文件位於AppBundle / Resources / config / doctrine中。刪除這些文件后,一切都按預期工作。
首先,您應該在該網站上對其進行解釋。
第二,您應該將類命名為單個對象,這意味着將它們命名為Square而不是Squares,將它們命名為Asset而不是Assets。
您可以省去msid列,因為Doctrine通過使用放置了mapping / reversedby屬性的列來為您進行映射。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.