使用 Doctrine2 连接表
Posted
技术标签:
【中文标题】使用 Doctrine2 连接表【英文标题】:Join tables with 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;
知道我做错了什么吗?
提前致谢!
【问题讨论】:
【参考方案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 找到更多有关协会的信息。
【讨论】:
以上是关于使用 Doctrine2 连接表的主要内容,如果未能解决你的问题,请参考以下文章