J'ai un WarehouseAddress qui peut stocker de nombreux articles, également l'article peut être sur de nombreuses adresses (l'article n'est pas un seul "article", mais un type). Depuis que j'ai suivi la documentation, j'avais besoin de créer une table de jointure qui ne peut pas avoir de clé primaire et ne peut avoir que ces champs: ItemsAddresses (warehouse_address_id, items_id), donc je ne peux pas utiliser la fonction de suppression car elle prend $ id comme paramètre, et mes ItemsAddresses ne pas d'identifiant. Je dois donc utiliser une fonction deleteAll.

class ItemsAddress extends AppModel {

public $belongsTo = array(
    'WarehouseAddresses' => array(
        'className' => 'WarehouseAddresses',
        'foreignKey' => 'warehouse_addresses_id',
    ),
    'Items' => array(
        'className' => 'Items',
        'foreignKey' => 'items_id',
    )
);}

class Item extends AppModel{
public $hasMany = array(
        'ItemsAddresses' => array(
            'className' => 'ItemsAddress',
            'foreignKey' => 'items_id',
        )
)
}

class WarehouseAddress extends AppModel{
    public $hasMany = array(
        'ItemsAddresses' => array(
            'className' => 'ItemsAddress',
            'foreignKey' => 'warehouse_addresses_id',
        ),);

}

Donc, tout est défini selon la documentation et lié correctement, mais lorsque j'essaie de le supprimer dans un contrôleur, il renvoie une erreur de base de données. Gardez à l'esprit que les données de demande sont bonnes (j'ai débogué et j'envoie des identifiants comme je le devrais).

class WarehouseAddressesController{
    public function removeFromAddress($id = null){
        $this->load();
        $this->WarehouseAddress->id = $this->Session->read('addressId');
        if($this->ItemsAddress->deleteAll(array('warehouses_id' => $this->Session->read('addressId'), 'items_id' => $id), false, false)){
            //Success
        }
        else {
            //errors
        }}}

Et voici la requête SQL:

 DELETE `ItemsAddress` FROM `modules`.`items_addresses` AS `ItemsAddress` LEFT JOIN `modules`.`warehouse_addresses` AS `WarehouseAddresses` ON (`ItemsAddress`.`warehouse_addresses_id` = `WarehouseAddresses`.`id`) LEFT JOIN `modules`.`items` AS `Items` ON (`ItemsAddress`.`items_id` = `Items`.`id`) WHERE `warehouses_id` = '7' AND `items_id` = 132 

Comme vous pouvez le voir, il essaie de joindre des tables lors de la suppression (! ??), vous ne savez pas pourquoi, mais cela ne fonctionne pas et la documentation ne contient rien.

0
Младен Карић 4 nov. 2019 à 12:43

1 réponse

Je viens de découvrir que j'ai fait une erreur dans une fonction Supprimer tout. Apparemment, je n'ai pas réglé correctement les paramètres, la fonction devrait aller: $this->ItemsAddress->deleteAll(array('warehouse_addresses_id' => $this->Session->read('addressId'), 'items_id' => $id), false, false).

0
Младен Карић 4 nov. 2019 à 09:46