views:

215

answers:

2

Hi,

I'm building a Task in Symfony with Doctrine. I'm getting all the places to make a batch update to a particular field. This has to be done in two languages. I'm using setBaseQuery() to make the JOIN on the query with the language I want.

If I do the following in an action, it works without any problem. However, If I do it in a task; it doesn't work as expected. The task runs perfectly two times (one in english and the other in english too!).

Any ideas on what I have to do different on tasks?

thanks!

$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);
    ..
  }
}
A: 

To gain database access in your tasks you'll need to call the following in your execute() method before any other database calls:

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

http://www.symfony-project.org/book/1_2/16-Application-Management-Tools#chapter_16_sub_custom_tasks_new_in_symfony_1_1

Cryo
I already do that, and also$connection = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : null)->getConnection();
fesja
A: 

so the solution I've found is adding $model->Translation[$lang]->title. It's strange because the title should have been loaded through the setbasequery; but it seems not.

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

Update

I'm getting the translation but $continent->save() didn't save the changes in Spanish (however it's saving it in English). I had to do a manual query in Doctrine:

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

now everything works...

fesja