2011-12-23 3 views
0

У меня щеколда время переводил следующий необработанный MySQL запрос, который был проверен и работает очень хорошо, в доктрине 1.2:перевести сырец MySQL в Доктрине 1,2

SELECT 
    r.name AS regionname, 
    s.name AS statename 
FROM 
    job j 
LEFT JOIN 
    community c ON c.id = j.community_id 
LEFT JOIN 
    state s ON s.id = c.state_id 
LEFT JOIN 
    region r ON r.id = s.region_id 
WHERE 
    r.id = 1 

Это не работает:

$q = Doctrine_Query::create() 
    ->select('r.name AS regionname', 's.name AS statename') 
    ->from('job j') 
    ->leftJoin('community c ON c.id = j.community_id') 
    ->leftJoin('state s ON s.id = c.state_id') 
    ->leftJoin('region r ON r.id = s.region_id') 
    ->where('r.id = 1') 
    ->execute(); 

Вот моя дб структура, если она полезна:

job: 
columns: 
    id 
    community_id 
relations: 
    community: local_key: community_id, foreign_key: id, foreignAlias: Communitys 

community: 
columns: 
    id 
    state_id 
relations: 
    state: local_key: state_id, foreign_key: id, foreignAlias: States 

state: 
columns: 
    id 
    name 
    region_id 
relations: 
    region: local_key: region_id, foreign_key: id, foreignAlias: Regions 

region: 
columns: 
    id 
    name 

ответ

0

Я заметил то же самое, Что ж. Выполнение соединений в Doctrine 1.2 немного отличается от mysql. Чтобы сделать соединение, вы должны воспользоваться отношениями, которые Doctrine создает в каждом компоненте в вашем случае класс задания.

Вы можете проверить базовый класс задания для этих отношений, о которых я говорю. В способе установки, они выглядят, как это, например, для внешнего ключа идентификатора сообщества в таблице работы:

$this->hasOne('community as Communitys', array(
     'local' => 'community_id', 
     'foreign' => 'id')); 

Возвращаясь к вашему вопросу, чтобы сделать присоединиться, вы должны ссылаться на псевдоним таблицы, где иностранный ключ принадлежит. Например, если вы хотите присоединиться на столе сообщества с псевдонимом сообщества:

->leftJoin('j.Community') 

вместо

community c ON c.id = j.community_id 

Обратите внимание, что я не говорил присоединиться по идентификатору, потому что в Учении 1.2, что подразумевается уже , Однако вы можете присоединиться к чему-то еще.

Аналогично, если таблиц вы ранее присоединились к должны быть присоединены к другим таблицам они имеют внешние ключи вы должны

1.Use их псевдоним в текущем queryand 2.reference компонента, как указано в их базовый класс.

Так вы сказали, что вы хотите присоединиться к сообществу государств в текущем запросе, как вы должны сделать это

// join job and community first 
->from('job j') 
->leftJoin('j.Community c') 
// join community to state since they are the ones that are related 
->leftjoin('c.States s') 

Отсюда я надеюсь, что вы можете увидеть образец. В конце дня, если вы посмотрите на него идея о присоединении все та же с сырым SQL, единственным отличием является синтаксис:

SQL Синтаксис:

LEFT JOIN 
    community c ON c.id = j.community_id 

DQL Синтаксис:

->leftJoin('j.Community c') 

Во всяком случае, чтобы ответить на ваш вопрос, вот как присоединиться должно быть сделано несколько:

$q = Doctrine_Query::create() 
    ->select('*') 
    ->from('job j') 
    ->leftJoin('j.Community c') 
    ->leftJoin('c.State s') 
    ->leftJoin('s.Region r') 
    ->where('r.id = 1') 
    ->execute(); 
+0

Спасибо за подробный ответ. К сожалению, он не работает. Я тоже пытался отключить иностранный псевдоним, но он зацикливается на них. Это ошибка, которую я получаю, когда пытаюсь их использовать: «Неизвестное отношение alias Community» И я получаю эти ошибки всякий раз, когда я пытаюсь их использовать. Я проверю, что они находятся в методе настройки и repost. Еще раз спасибо. – Patrick

+0

... и это действительно проблема. Нет утверждения «community as Communitys», просто «Community, array ('.Который меня немного озадачивает, потому что моя схема утверждает это как иностранный псевдоним. Но моя схема не идентифицирует ее как отношения «один-к-одному». Это проблема? Обновление – Patrick

+0

: я изменил базовый класс на включение предложения «как» (я знаю, что это плохая форма, и я изменю его в схеме, если он в конечном итоге исправит проблему), и это устранило проблему для отношения «Сообщество» , однако теперь он зацикливается на предложении «Штаты», давая мне ошибку, говоря, что работа должна относиться к государству ... которое оно не в моей схеме ... сообщество относится к государству. Любая идея для решения? – Patrick