Объединяйте таблицы с помощью Doctrine2 - PullRequest
0 голосов
/ 07 июля 2011

Я пытаюсь сделать соединение между 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 Model

/**
 * @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;

Есть идеи, что я делаю не так?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 01 сентября 2013

Не отображайте столбцы БД, которые вам нужны для отношения, как и @Column, и @ManyToOne (или OneToOne), но всегда выбирайте один.Для большинства отношений вам понадобятся сопоставления ассоциаций (@ManyToOne и т. Д.) И вам нужно удалить столбец @.

Доктрина будет вести себя очень хаотично, если вы используете оба.

/**
 * @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;

}

Вы можете найти больше информации о ассоциациях здесь .

0 голосов
/ 07 июля 2011

Не похоже, что вы рассказали 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');

Не проверено, но что-то подобное должно работать.

...