web-dev-qa-db-fra.com

Impossible de mettre à jour NULL via updateObject

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.

1
Malaiselvan

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.

https://docs.joomla.org/API17:JDatabase::updateObject

1
Malaiselvan

La façon dont cela devrait être fait

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.

Comment effectuer la mise à jour des nulls dans updateObject ()

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.

S'il n'y a pas de méthode API pour votre cas

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();
0
Artur Stępień