setBaseQuery не работает для задач в Symfony - PullRequest
1 голос
/ 18 февраля 2010

Я создаю задание в Symfony с помощью Doctrine. Я получаю все места, чтобы сделать пакетное обновление для определенного поля. Это должно быть сделано на двух языках. Я использую setBaseQuery (), чтобы создать JOIN для запроса с нужным мне языком.

Если я сделаю следующее в действии, оно будет работать без проблем. Однако, если я делаю это в задании; это не работает, как ожидалось. Задание отлично выполняется два раза (один на английском и другой на английском!).

Любые идеи о том, что я должен делать по-разному в задачах?

спасибо!

$languages = array('es' => 'Spanish', 'en' => 'English');
foreach($languages as $lang => $value) {

  // get all the places
  $q = Doctrine::getTable('Place')
    ->createQuery('p')
    ->leftJoin('p.Translation ptr')
    ->addWhere('ptr.lang = ?', $lang);

  $treeObject = Doctrine::getTable('Place')->getTree();
  $rootColumnName = $treeObject->getAttribute ( 'rootColumnName' );
  $treeObject->setBaseQuery($q);

  // all the continents
  foreach ( $treeObject->fetchRoots() as $continent ) {
    $this->log(date("Y-m-d H:i:s").' '.$lang.' Continent '.$continent->title);
    ..
  }
}

Ответы [ 2 ]

0 голосов
/ 20 февраля 2010

так что решение, которое я нашел, это добавление $ model-> Translation [$ lang] -> title. Это странно, потому что заголовок должен был быть загружен через setbasequery; но, похоже, нет.

// all the continents
foreach ( $treeObject->fetchRoots() as $continent ) {
  $this->log(date("Y-m-d H:i:s").' '.$lang.' Continent '.$continent->Translation[$lang]->title);
  ..
}

Обновление

Я получаю перевод, но $ continent-> save () не сохранил изменения на испанском (но сохраняет на английском). Мне пришлось сделать ручной запрос в доктрине:

$con = Doctrine_Manager::getInstance()->connection();
...
$con->execute("update model_translation set field='".$field."' where id='".$model->id."' and lang='".$lang."'");

теперь все работает ...

0 голосов
/ 19 февраля 2010

Чтобы получить доступ к базе данных в ваших задачах, вам нужно вызвать следующий метод в execute() перед вызовом любой другой базы данных:

$databaseManager = new sfDatabaseManager($this->configuration);

http://www.symfony -project.org / книга / 1_2 / 16-Application-Management-Tools # chapter_16_sub_custom_tasks_new_in_symfony_1_1

...