簡體   English   中英

一對多Symfony主義返回空結果

[英]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;
    // ...
}

請參閱mappedByinversedBy選項如何指向相關實體的字段名稱,並注意關聯如何完全不引用實體的實際標識。 如果要控制將為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM