CakePHP Supprimer avec Plusieurs Conditions
Cela me rend fou. Pourquoi ne Gâteau besoin de faire des choses trop complexes..
Je suis l'espoir d'obtenir Gâteau pour générer du SQL qui ressemble à ceci..
J'attends le SQL qui fonctionne à
DELETE `ProductVouchers`
FROM `product_vouchers` AS `ProductVouchers`
WHERE `ProductVouchers`.`id` = 16
AND `ProductVouchers`.`client_id` IS NULL;
Je suis en utilisant delete()
comme ce
$this->ProductVouchers->delete([
'ProductVouchers.id'=>$id,
'ProductVouchers.client_id'=>"NULL"
]);
Le journal montre
DELETE `ProductVouchers`
FROM `product_vouchers` AS `ProductVouchers`
WHERE `ProductVouchers`.`id` IN (16, 'NULL')
Essayer
$this->ProductVouchers->delete([
'ProductVouchers.id'=>$id,
'ProductVouchers.client_id'=>NULL
]);
Journal montre
DELETE `ProductVouchers`
FROM `product_vouchers` AS `ProductVouchers`
WHERE `ProductVouchers`.`id` IN (16, NULL)
Essayer:
$this->ProductVouchers->delete([
'ProductVouchers.id'=>$id,
'ProductVouchers.client_id IS NULL'
]);
Journal montre rien de ce qui est encore plus mauvais!
EDIT:
Comme l'a souligné dans la réponse ci-dessous la delete()
méthode est incorrect, car il n'accepte que la clé primaire comme un entier. Donc, en utilisant deleteAll()
$this->ProductVouchers->deleteAll([
'ProductVouchers.id'=>$id,
'ProductVouchers.client_id'=>'NULL'
]);
Ce produit aussi rien dans le journal ou de toute erreur. À essayer:
$this->ProductVouchers->deleteAll([
'ProductVouchers.id'=>$id,
'ProductVouchers.client_id'=>NULL
]);
Ce produit...
DELETE `ProductVouchers`
FROM `product_vouchers` AS `ProductVouchers`
WHERE `ProductVouchers`.`id` = (17)
Qui est à la fois tort et bizarre (ce qui est le point de fixation??)
Pourquoi quoi? Je ne suis pas la question?
Mise à jour de ma question - désolé n'était pas très clair. produit de ma frustration
Mise à jour de ma question - désolé n'était pas très clair. produit de ma frustration
OriginalL'auteur Mike Miller | 2015-03-19
Vous devez vous connecter pour publier un commentaire.
Modèle::delete s'attend à un id
Supprimer est une méthode pour supprimer une ligne, par la valeur de la clé primaire. La signature de la méthode pour Modèle::delete ne s'attend pas à des conditions:
Le comportement lorsqu'il est appelé le passage d'un tableau, c'est qu'il ne fonctionne pas, d'une manière ou d'une autre (dans le cas ici, les valeurs de tableau de tableau des conditions sont compris pour être ids et utilisés pour trouver un enregistrement à supprimer - supprimer au plus une ligne).
Modèle::deleteAll s'attend à des conditions
deleteAll est une méthode de suppression de lignes à conditions:
Le bon appel de la logique dans la question serait:
Ce produit aussi rien dans le journal ou de toute erreur
Appel deleteAll avec
$cascade
true (par défaut) signifie:Si aucun enregistrement n'est trouvé correspondant aux conditions, il n'y aura pas de supprimer la déclaration.
Cet état de fragment:
Va générer cette sql:
I. e. il sera de retour les lignes où client_id est la chaîne de caractères "NULL" - n'est donc pas de supprimer la déclaration parce qu'il y a pas des lignes avec un client_id ensemble de la chaîne de la valeur "NULL".
Qui est à la fois tort et bizarre (ce qui est le point de fixation??)
Fait que la déclaration est attendu si il y a un enregistrement avec cette clé primaire et client_id la valeur null (il y aura une instruction select immédiatement avant qu'il recherche par id et client_id valeur). Les parenthèses ne sont d'aucune pertinence fonctionnelle, ces deux états sont équivalents:
Comment supprimer par des conditions?
Pour générer l'équivalent de ce sql:
Il suffit de désactiver
$cascade
:OriginalL'auteur AD7six
Il suffit de lire les docs, les
supprimer
méthode ne prend que l'identifiant dans le premier paramètre un nombre entier de par leur conception.Il ressemble le Gâteau de l'équipe peut avoir accepté formats de tableaux mais seulement d'utiliser le tableau de valeurs d'alimentation dans la requête de suppression (ignorant ainsi les touches et l'aide de l'identifiant à chaque fois.)
Je crois que vous êtes à la recherche pour le
deleteAll
méthode, qui accepte la coutume des conditions que vous avez fourni dans votre question:Pouvez-vous modifier dans vos expériences et de vos journaux avec
deleteAll
?fait - merci beaucoup pour votre aide
OriginalL'auteur sjagr
Essayer de suivre:
Devrait créer Requête SQL suivante:
"(1, 8, 100)" est le résultat de la précédente appelée instruction SELECT.
OR
dans la question.OriginalL'auteur tuffz
Le problème est lié à un
$belongsTo
variable dans le modèleProductVouchers
modèle. C'est bien ce jeu je ne peux pas appliquer les critères de la clé étrangère, sans réglage de la$cascade
argument false comme ceci:Ce produit de travail SQL
EDIT:
Suivez @AD7six globale de réponse à supprimer l'inutile rejoindre.
Les indésirables de jointure est un artefact de la façon dont il a toujours travaillé - une solution de contournement consiste à séparer l'association avant d'appeler deleteAll (Ou en mélangeant le patrimoine de l'association sens par exemple de créer dans votre modèle d'application
public function deleteAll(...) { $old = $this->belongsTo; $this->belongsTo = []; $return = parent::deleteAll(...); $this->belongsTo = $old; return $return; }
- Après tests et de vérifier cela par vous-même - je vous recommande le montage de votre réponse pour avoir un exemple de code - rend la réponse plus utile à d'autres lecteurs (pas besoin de mentionner mon pseudo - merci pour la pensée).OriginalL'auteur Mike Miller