【问题标题】:Join tables with Doctrine2使用 Doctrine2 连接表
【发布时间】:2011-07-07 15:35:46
【问题描述】:

我正在尝试在 2 个表之间进行连接,但出现此错误:

消息:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 1 行的 '' 附近使用

这是代码:

页面模型

public function __construct()
{
    $this->pages_meta = new \Doctrine\Common\Collections\ArrayCollection();
}   
/**
 * @var integer $id
 * @Id @Column(type="integer") 
 * @GeneratedValue
 */
private $id;

/**
 * @var integer $layout
 * @Column(type="string")
 */
private $layout;

/**
 * @var string $name
 * @Column(type="string")
 */
private $name;

/**
 * @var string $title
 * @Column(type="string")
 */
private $title;

/**
 * @var string $slug
 * @Column(type="string")
 */
private $slug;

/**
 * @var string $options
 * @Column(type="integer")
 */
private $content_id;

/**
 * @var integer $user_id
 * @Column(type="integer")
 */
private $user_id;

/**
 * @var string $created_at
 * @Column(type="datetime")
 */
private $created_at;

/**
 * @var string $language
 * @Column(type="string")
 */
private $language;

/**
 * @OneToMany(targetEntity="Default_Model_PageMeta", mappedBy="page_id")
 * @JoinColumn(name="id", referencedColumnName="page_id")
 */
private $meta;

... (getters and setters)

PageMeta 模型

/**
 * @var integer $id
 * @Id @Column(type="integer") 
 * @GeneratedValue
 */
private $id;

/**
 * @var integer $page_id
 * @Column(type="integer")
 */
private $page_id;

/**
 * @var integer $key
 * @Column(type="string")
 */
private $key;

/**
 * @var integer $value
 * @Column(type="string")
 */
private $value;

... (getters and setters)

连接语法

    $doctrine = Zend_Registry::get('doctrine');
    $request = Zend_Controller_Front::getInstance()->getRequest();

    $qb = $doctrine->_em->createQueryBuilder()
            ->select('p, m')
            ->from('Default_Model_Page', 'p')
            ->join('p.meta', 'm');
    $query = $qb->getQuery();
    $page = $query->getResult();

    Zend_Debug::dump($page); die;

知道我做错了什么吗?

提前致谢!

【问题讨论】:

    标签: zend-framework orm doctrine-orm


    【解决方案1】:

    您似乎没有告诉 Doctrine 如何将 Page 模型与 PageMeta 模型相关联。我可以猜到 PageMeta 表中的外键是 page_id,但这不会出现在您的注释中。

    在 PageMeta 模型中,尝试:

    /**
     * The page
     *
     * @var Default_Model_Page
     * @OneToOne(targetEntity="Default_Model_Page")
     * @JoinColumn(name="page_id", referencedColumnName="id")
     */
    private $page;
    

    那么在你的查询中,你应该可以做到:

    $qb = $doctrine->_em->createQueryBuilder()
            ->select('p, m')
            ->from('Default_Model_PageMeta', 'm')
            ->join('m.page', 'p');
    

    未经测试,但这样的东西应该可以工作。

    【讨论】:

    • 我是个白痴。完全错过了页面模型底部的元映射。请无视答案。也许我会再看一眼并更新答案,以拼命尝试真正找到线索。对不起。 #MoreCoffee
    【解决方案2】:

    不要将关系所需的数据库列映射为同时@Column 和@ManyToOne(或OneToOne),但总是选择一个。对于大多数关系,您需要关联映射(@ManyToOne 等)并且需要删除 @Column。

    如果同时使用,Doctrine 的行为会非常不稳定。

    /**
     * @Entity
     */
    class Page
    {
        /**
         * @OneToMany(targetEntity="PageMeta", mappedBy="page")
         */
        private $meta;
    
        public function __construct() {
            $this->meta = new \Doctrine\Common\Collections\ArrayCollection();
        }
    }
    
    /**
     * @Entity
     */
    class PageMeta
    {
        // Remove the property $page_id
    
        /**
         * @ManyToOne(targetEntity="Page", inversedBy="meta")
         * @JoinColumn(name="page_id", referencedColumnName="id")
         */
        private $page;
    
    }
    

    您可以在here 找到更多有关协会的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多