DQL Update NULL avec Doctrine

Pour mettre à jour une valeur qui peut être nulle ou peut contenir une valeur valide non nulle, il vous faut faire un if ternaire : condition ? true : false

->set('leChamp', (($laValeur=== null) ? 'NULL' : '?'), $laValeur)

ou coder le if

  • pour le null
->set('leChamp', 'NULL');
  • pour la valeur (non nulle)
->set('leChamp', '?', $laValeur);

Mais ne surtout pas faire :

$laValeur = null;
 ->set('leChamp', '?', $laValeur);

équivalent à

->set('leChamp', '?', null);

car cela provoque l'erreur suivante : Fatal error: Uncaught exception 'Doctrine_Connection_Mysql_Exception' with message 'SQLSTATEHY093: Invalid parameter number: number of bound variables does not match number of tokens'

DQL Update fails with passed NULL value (closed defect: invalid)
When you want to set null values, you have to use the second argument.
->set('f.bar', 'NULL');
Let's imagine a real life situation. If may be NULL or a valid value... so your code will be something like:
->set('f.bar', (($value === null) ? 'NULL' : '?'), $value)

Utilisation basique de Doctrine

Select Doctrine

$users = Doctrine::getTable('User')->findAll();
  foreach($users as $user) {
   echo $user->name;
  }

Insert Doctrine

$user = new User();
 $user->name = "marie";
 $user->password = "xxx";
 $user->save();
 
 echo "L'utilisateur avec l'id $user->id a été ajouté";

Update Doctrine

$user = Doctrine::getTable('User')->findBy(2);
  $user->phone = "09 22 22 22";
  $user->save();

Delete Doctrine

$user = Doctrine::getTable('User')->findByName("marie");
  $user->delete();

Les "Magic Finders"

Les patterns de base pour les méthodes de recherche (Magic Finders) sont les suivants : findBy%s($valeur) ou findOneBy%s($valeur). Le %s peut être un nom de colonne ou un alias de relation.

// Recherche par la clé primaire : $tableClass->find($primaryKey);
$user = $userTable->find(1);
// Recherche par champs : (username) : $tableClass>findOneByUsername($searchInput);
$userTable->findOneByUsername('jonwage');
// En combinant les critères de recherche : 
$user = $userTable->findOneByUsernameAndPassword('jonwage', md5('changeme'));
$users = $userTable->findByIsAdminAndIsModeratorOrIsSuperAdmin(true, true, true);

Ressources

Les versions de Doctrine 1.2.x

  • Doctrine 1.2.4 2011-03-21
  • Doctrine 1.2.3 2010-08-24
  • Doctrine 1.2.2 2010-03-29
  • Doctrine 1.2.1 2009-12-07