Nano Hash - криптовалюты, майнинг, программирование

перевести необработанный MySQL в Doctrine 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();

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

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
23.12.2011

Ответы:


1

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

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

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

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

->leftJoin('j.Community')

вместо

community c ON c.id = j.community_id

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

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

1. Используйте их псевдоним в текущем запросе и 2. Ссылайтесь на компонент, как указано в ИХ базовом классе.

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

// 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();
23.12.2011
  • Спасибо за подробный ответ. К сожалению, это не работает. Я тоже пытался отключить иностранный псевдоним, но он зацикливается на них. Это ошибка, которую я получаю, когда пытаюсь их использовать: Неизвестный псевдоним отношения Сообщества. И я получаю эти ошибки всякий раз, когда пытаюсь использовать любой из них. Я проверю, что они есть в методе настройки и репост. Спасибо еще раз. 24.12.2011
  • ... и это, кажется, проблема. Нет утверждения «сообщество как сообщество», просто «Сообщество, массив (». Что меня немного смущает, потому что моя схема указывает это как иностранный псевдоним. Но моя схема не идентифицирует это как отношение один к одному. В этом проблема? 24.12.2011
  • обновление: я изменил базовый класс, включив в него предложение as (я знаю, что это плохая форма, и я изменю его в схеме, если это в конечном итоге решит проблему), и это действительно решило проблему для отношений сообщества, однако теперь это зависает на предложении States, выдавая мне ошибку, говорящую, что задание должно быть связано с состоянием... чего нет в моей схеме... сообщество связано с состоянием. Любая идея для решения? 24.12.2011
  • обновление 2: к вашему сведению, после того, как я обновил свои базовые классы, включив в них предложение as, он разбивает все предыдущие запросы в моем приложении, которые были связаны с сообществом, поэтому не похоже, что обновление отношений один к одному является решение. 24.12.2011
  • Извините за задержку с ответом. Я только что увидел это сейчас, и у нас может быть разница в часовых поясах. Можете ли вы опубликовать свой базовый класс Job здесь? 25.12.2011
  • Моя очередь извиниться и поблагодарить вас за то, что нашли время, чтобы решить мою проблему. Я разместил свой базовый класс в исходном вопросе. Он был урезан, поэтому, если вы заметили некоторые несоответствия, это, вероятно, связано с этим. Спасибо еще раз. 26.12.2011
  • Тебе повезло, что я не сплю в 4 утра, учусь и работаю. Обновил мой ответ ;) 27.12.2011
  • Я хотел поблагодарить тебя раньше... спасибо, Джуэн! С вашей настойчивой помощью все заработало. 29.12.2011
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..