【问题标题】:Doctrine geberated entities, broken vars and relations, Doctrine 2 and zf2Doctrine geberated 实体、损坏的变量和关系、Doctrine 2 和 zf2
【发布时间】:2014-03-08 03:39:37
【问题描述】:

我有一个旧的 MySQL 数据库。不知何故,我设法从命令行生成了实体,但是结果与我的预期不同。

生成后,它从我的表和字段名称中删除了_;比如这个类:

namespace CMS\Entity;

use Doctrine\ORM\Mapping as ORM;


/**
 * Countries
 *
 * @ORM\Table(name="Countries")
 * @ORM\Entity
 */
class Countries
{
    /**
     * @var integer
     *
     * @ORM\Column(name="pa_CountryID", type="integer", precision=0, scale=0, nullable=false, unique=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $paCountryid;

    /**
     * @var string
     *
     * @ORM\Column(name="t_CountryName", type="string", length=255, precision=0, scale=0, nullable=false, unique=false)
     */
    private $tCountryname;

    /**
     * @var string
     *
     * @ORM\Column(name="t_MapAbr", type="string", length=255, precision=0, scale=0, nullable=true, unique=false)
     */
    private $tMapabr;


    /**
     * Get paCountryid
     *
     * @return integer 
     */
    public function getPaCountryid()
    {
        return $this->paCountryid;
    }

    /**
     * Set tCountryname
     *
     * @param string $tCountryname
     * @return Countries
     */
    public function setTCountryname($tCountryname)
    {
        $this->tCountryname = $tCountryname;

        return $this;
    }

    /**
     * Get tCountryname
     *
     * @return string 
     */
    public function getTCountryname()
    {
        return $this->tCountryname;
    }

    /**
     * Set tMapabr
     *
     * @param string $tMapabr
     * @return Countries
     */
    public function setTMapabr($tMapabr)
    {
        $this->tMapabr = $tMapabr;

        return $this;
    }

    /**
     * Get tMapabr
     *
     * @return string 
     */
    public function getTMapabr()
    {
        return $this->tMapabr;
    }
}

我的问题:

  • 如何生成具有完全相同相同表和字段名称的实体?
  • 如果我有另一个使用pa_CountryID 作为外键的实体;如何建立它们之间的关系以一步填充它们?

我的另一个实体如下所示:

<?php
namespace CMS\Entity;

use Doctrine\ORM\Mapping as ORM;
/**
 * LoginUsers
 *
 * @ORM\Table(name="Login_Users", indexes={@ORM\Index(name="fulltext", columns={"pt_userName", "t_firstName", "t_lasName"})})
 * @ORM\Entity
 */
class LoginUsers
{
    /**
     * @var integer
     *
     * @ORM\Column(name="pa_userID", type="integer", precision=0, scale=0, nullable=false, unique=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $paUserid;

    /**
     * @var string
     *
     * @ORM\Column(name="pt_userName", type="string", length=50, precision=0, scale=0, nullable=false, unique=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $ptUsername;


    /**
     * @var integer
     *
     * @ORM\Column(name="i_CountryID", type="integer", precision=0, scale=0, nullable=true, unique=false)
     */
    private $iCountryid;
}

【问题讨论】:

    标签: php symfony orm doctrine-orm zend-framework2


    【解决方案1】:

    1.

    如何生成表名和字段名完全相同的实体?

    我认为你错了。所有字段名称都可以。看注释

    /**
     * ...
     * @ORM\Column(name="pa_userID", type="integer", precision=0, scale=0, nullable=false, unique=false)
     * ...
     */
    private $paUserid;
    

    你有类属性$paUserid,但ORM 列名是pa_userID。因此,没有“_”的属性映射正确。这是一个 Symfony 命名约定。

    2.

    如果我有另一个使用 pa_CountryID 作为外键的实体;如何建立它们之间的关系以一步填充它们?

    正如我提到的列名是好的。所以你们的关系是安全的。现在要在表格之间建立关系,您应该阅读 Database & DoctrineDoctrine Associations

    在大捷径 - 如何设置登录用户和国家之间的关系。现在 LoginUsers::$iCountryid 将是一个国家对象,而不是一个 ID。在数据库中,您当然会找到 id。

    // ...
    use Doctrine\Common\Collections\ArrayCollection;
    // ...
    class Countries
    {
        // ...
        /**
         * @var Doctrine\Common\Collections\ArrayCollection
         *
         * @ORM\OneToMany(targetEntity="\CMS\Entity\LoginUsers", mappedBy="iCountryid")
         */
        private $loginUsers;
        // ...
        public function __construct()
        {
            $this->loginUsers = new ArrayCollection();
        }
    }
    
    class LoginUsers
    {
        // ...
        /**
         * @var \CMS\Entity\Countries
         *
         * @ORM\ManyToOne(targetEntity="\CMS\Entity\Countries", inversedBy="loginUsers")
         * @ORM\JoinColumn(name="i_CountryID", referencedColumnName="id")
         */
        private $iCountryid;
        // ...
    }
    

    【讨论】:

    • 感谢您的快速响应,我是 Zend 技术和 Doctrine 的新手,这是一个很好的例子,但我仍然遇到链接问题,我在阅读并应用后得到的结果解决方案,例如我的记录的国家 ID 是 117,但它正在获取 ID 为 234 的对象,我检查了查询,但没有在 sql 中应用连接。正在搜索为什么映射总是取数据库中的最后一行或结果集不是确切的那一行?
    • 哦,我做了以下操作从国家类中删除了构造代码,因为每个用户只有 1 个国家,修复了 loginusers 类中的映射:@ORM\JoinColumn(name="i_CountryID ", referencedColumnName="id") to: * @ORM\JoinColumn(name="i_CountryID", referencedColumnName="pa_CountryID") 和宾果游戏得到了正确的国家:),我在我的表中的所有关系 Parent--->有多个 sutff,但有些没有。我想我会在使用它时了解更多信息。这是一个已接受的答案:) 再次感谢您
    【解决方案2】:

    @ORM\Table 和@ORM\Column 中的“name”属性表示数据库中的表和字段名称,没有任何变化,除了当您与 PHP 对象交互时,它没有下划线

    【讨论】:

      猜你喜欢
      • 2015-02-06
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      相关资源
      最近更新 更多