Nous avons obtenu 2 tables où une table est parent et une autre table en tant qu'enfant avec référence de clé primaire et étrangère.
Supposons que table1 est le parent et table2 est l'enfant comme ci-dessous.
tableau 1:
id <- primary key of table1
name <- name field
tableau 2:
id <- primary key of table2 auto increment
par_id <- foreign key referring table1 default to NULL
position <- posiiton field
L'extrait de code ci-dessous consiste à mettre à jour un enregistrement existant dans la table enfant avec par_id comme NULL
$recObj = new stdClass ();
$recObj->id = '1';
$recObj->par_id=null
$recObj->position="test position"
$db->updateObject('#__table2', $recObj, 'id');
Lorsque le code ci-dessus s'exécute, il ne met pas à jour le par_id à null. Au lieu de cela, l'ancienne valeur reste.
Trouvé un moyen en ajoutant un autre paramètre comme ci-dessous:
$db->updateObject('#__table2', $recObj, 'id', true);
Le 4ème paramètre détermine si des valeurs nulles peuvent être utilisées ou non. Par défaut, ce sera défini comme faux.
Pour l'instant (jusqu'à ce qu'ils introduisent la prise en charge complète des entités quelque part dans Joomla! 4.x), il est préférable d'utiliser JTable
pour stocker les "entités". De cette façon, vous pouvez simplement définir le paramètre $updateNulls
Dans la méthode JTable::store()
o true
. Il simplifie également beaucoup de CRUD et valide les opérations en accélérant votre programmation. Vous pouvez en savoir plus dans un documentation JTable ou rechercher l'utilisation des tables dans les composants principaux.
La deuxième méthode consiste à fournir le quatrième paramètre à la méthode JDatabase::updateObject()
comme vous l'avez fait. Pour autant que je m'en souvienne, il est utilisé dans JTable::store()
en interne.
En dernier recours, vous pouvez toujours exécuter une requête directe:
use Joomla\CMS\Factory;
$db = Factory::getDbo();
$q = $db->getQuery(true);
$q
->update('#__table2')
->set('b = NULL')
->where('id=1');
$db->setQuery($q);
$db->execute();