首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Doctrine2连接表

使用Doctrine2连接表
EN

Stack Overflow用户
提问于 2011-07-07 23:35:46
回答 2查看 675关注 0票数 0

我试图在两个表之间进行连接,但是我得到了这个错误:

消息: SQLSTATE42000:语法错误或访问冲突: 1064您的SQL语法中有一个错误;请查看与您的MySQL服务器版本对应的手册,了解在第1行'‘附近使用的正确语法

代码如下:

页面模型

代码语言:javascript
复制
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模型

代码语言:javascript
复制
/**
 * @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)

join语法

代码语言:javascript
复制
    $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;

知道我做错了什么吗?

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2011-07-08 00:24:08

看起来您还没有告诉Doctrine如何将页面模型与PageMeta模型相关联。我可以猜到PageMeta表中的外键是page_id,但它不会出现在您的注释中。

在PageMeta模型中,尝试:

代码语言:javascript
复制
/**
 * The page
 *
 * @var Default_Model_Page
 * @OneToOne(targetEntity="Default_Model_Page")
 * @JoinColumn(name="page_id", referencedColumnName="id")
 */
private $page;

然后,在查询中,您应该能够执行以下操作:

代码语言:javascript
复制
$qb = $doctrine->_em->createQueryBuilder()
        ->select('p, m')
        ->from('Default_Model_PageMeta', 'm')
        ->join('m.page', 'p');

没有经过测试,但是像这样的东西应该可以工作。

票数 0
EN

Stack Overflow用户

发布于 2013-09-01 21:42:02

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

如果你同时使用这两种方法,理论将会变得非常不稳定。

代码语言:javascript
复制
/**
 * @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;

}

你可以在assiciations here上找到更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6613171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档