Простой запрос доктрины innerJoin

Я попытался создать простой выбор SQL:

SELECT c.com_id, c.pro_id, c.com_nombre 
FROM bd_fn.fn_comuna c  
inner join bd_fn.fn_provincia p 
on (c.pro_id = p.pro_id) 
where p.pro_nombre = 'namepro';

Но DQL выдает эту ошибку:

Doctrine_Table_Exception» с сообщением «Неизвестный псевдоним отношения fn_provincia.

Версия доктрины 1.XX, постоянство было создано Visual Paradigm. DQL это:

$q = Doctrine_Query::create()
    ->select('c.com_id')
    ->from('fn_comuna c')
    ->innerJoin('c.fn_provincia p')
    ->where('p.pro_nombre=?',$namepro);

класс fn_comuna.php

<?php
/**
 * "Visual Paradigm: DO NOT MODIFY THIS FILE!"
 * 
 * This is an automatic generated file. It will be regenerated every time 
 * you generate persistence class.
 * 
 * Modifying its content may cause the program not work, or your work may lost.
 */

class Fn_comuna extends Doctrine_Record {
  public function setTableDefinition() {
    $this->setTableName('bd_fn.fn_comuna');
    $this->hasColumn('com_id', 'integer', 4, array(
        'type' => 'integer',
        'length' => 4,
        'unsigned' => false,
        'notnull' => true,
        'primary' => true, 
        'autoincrement' => false,
      )
    );
    $this->hasColumn('pro_id', 'integer', 4, array(
        'type' => 'integer',
        'length' => 4,
        'unsigned' => false,
        'notnull' => true,
      )
    );
    $this->hasColumn('com_nombre', 'string', 100, array(
        'type' => 'string',
        'length' => 100,
        'fixed' => false,
        'notnull' => true,
      )
    );
  }

  public function setUp() {
    parent::setUp();
    $this->hasOne('Fn_provincia as pro', array(
        'local' => 'pro_id', 
        'foreign' => 'pro_id'
      )
    );
    $this->hasMany('Fn_institucion as fn_institucion', array(
        'local' => 'com_id', 
        'foreign' => 'com_id'
      )
    );
    $this->hasMany('Fn_replegal as fn_replegal', array(
        'local' => 'com_id', 
        'foreign' => 'com_id'
      )
    );
  }

}

?>

person h3g0r_    schedule 03.01.2013    source источник
comment
Какова схема вашего учения?   -  person j0k    schedule 04.01.2013
comment
Это то же самое, что и база данных? bd_fn — это схема SQL. Я создал постоянство с ORM от Visual Paradigm, с Doctrine 1.xx, для базы данных postgres. Присоединение - это проблема. Не знаю почему, если таблицы связаны.   -  person h3g0r_    schedule 04.01.2013
comment
Что внутри вашего класса модели доктрины fn_comuna?   -  person j0k    schedule 04.01.2013
comment
вам нужно поставить класс, сгенерированный ORM???   -  person h3g0r_    schedule 04.01.2013
comment
Ну конечно; естественно. Мы сможем увидеть, что Doctrine знает о вашей схеме.   -  person j0k    schedule 04.01.2013


Ответы (2)


Как видно из класса вашей модели, связь между fn_comuna и fn_provincia называется pro.

$this->hasOne('Fn_provincia as pro', array(
    'local' => 'pro_id', 
    'foreign' => 'pro_id'
  )
);

Поэтому вы должны использовать это имя, когда имеете дело с соединением:

$q = Doctrine_Query::create()
    ->select('c.com_id')
    ->from('fn_comuna c')
    ->innerJoin('c.pro p')
    ->where('p.pro_nombre=?', $namepro);
person j0k    schedule 04.01.2013
comment
@h3g0r_ Рад это слышать! Если мой ответ помог вам, можете принять его и проголосовать, если так считаете. - person j0k; 04.01.2013

Изменять:

p.pro_id = (SELECT p2.pro_id FROM etc..

To:

p.pro_id IN(SELECT p2.pro_id FROM etc..

Не уверен, зачем вам вообще нужен подзапрос, почему бы просто не потерять его и не заменить на:

where pro_nombre = 'namepro'
person Dave Sexton    schedule 03.01.2013
comment
До сих пор не работает. Да, подзапрос бесполезен, спасибо. Проблема в соединении. - person h3g0r_; 04.01.2013
comment
Мое решение странной ошибки INNERJOIN -›select('c.com_id') -›from('fn_comuna c') //-›innerJoin('c.fn_provincia p') -›where('c.pro_id = (SELECT p2.pro_id ОТ fn_provincia p2 ГДЕ p2.pro_nombre = ?)',$proname); все равно спасибо - person h3g0r_; 04.01.2013