2017-08-28 1 views
0

en utilisant InnoDb avec foreignkey configuration dans la base de données. Dans Phalcon également configurer les clés virtuelles. obtenir ci-dessous erreur lors de la suppression des enregistrements de phalcon en raison de Foreign Key configuration et aussi il y a encore des données dans les tableaux enfants.Phalcon: afficher le message d'erreur de fantaisie au lieu des exceptions standard

My Objective is to display fancy error message to user when this error displayed.

Affichage Erreur:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`invoice`.`invoice`, CONSTRAINT `Invoice.CustomerId` FOREIGN KEY (`CustomerId`) REFERENCES `customer` (`Id`)) 
#0 [internal function]: PDOStatement->execute() 
#1 [internal function]: Phalcon\Db\Adapter\Pdo->executePrepared(Object(PDOStatement), Array, Array) 
#2 [internal function]: Phalcon\Db\Adapter\Pdo->execute('DELETE FROM `in...', Array, Array) 
#3 [internal function]: Phalcon\Db\Adapter->delete(Array, '`Id` = ?', Array, Array) 
#4 C:\wamp\www\invoice\app\controllers\CustomerController.php(140): Phalcon\Mvc\Model->delete() 
#5 [internal function]: CustomerController->deleteAction('3') 
#6 [internal function]: Phalcon\Dispatcher->callActionMethod(Object(CustomerController), 'deleteAction', Array) 
#7 [internal function]: Phalcon\Dispatcher->_dispatch() 
#8 [internal function]: Phalcon\Dispatcher->dispatch() 
#9 C:\wamp\www\invoice\public\index.php(42): Phalcon\Mvc\Application->handle() 
#10 {main} 

Fancy Message d'erreur que je voulais afficher pour l'utilisateur:

The customer cannot be deleted because other invoices are using it

Ceci est mon modèle ressemble:

<?php 
    class Customer extends \Phalcon\Mvc\Model 
    { 
     public $id; 
     public $name; 
     public $street; 
     public $city; 
     public $country; 
     public $postalCode; 
     public $phone; 
     public $mobile; 
     public $fax; 
     public $email; 
     public $web; 
     public function initialize() 
     { 
      $this->setSchema("invoice"); 
      $this->setSource("customer"); 
      $this->hasMany(
       'Id', 
       'Invoice', 
       'Id', 
       [ 
        'alias' => 'Invoice', 
        'foreignKey' => [ 
         'message' => 'The customer cannot be deleted because other invoices are using it', 
        ] 
       ] 
      ); 
     } 
     public static function find($parameters = null) 
     { 
      return parent::find($parameters); 
     } 
     public static function findFirst($parameters = null) 
     { 
      return parent::findFirst($parameters); 
     } 
     public function getSource() 
     { 
      return 'customer'; 
     } 

    } 
    ?> 

Le code complet est disponible dans github en cas de référence.

+0

FYI: les modèles et les contrôleurs sont créés en utilisant 'php-devtools' Je crois qu'il n'y aura pas de problèmes dans' relations' –

+0

Attrape l'exception, puis gère-la à ton gré. http://php.net/manual/fr/language.exceptions.php – yogur

Répondre

0

Vous avez des mauvaises relations écrites.

arguments belongsTo:

  • premier est attribut (colonne) dans le modèle courant, la deuxième classe est liée, troisième colonne dans le modèle connexe

arguments hasMany/hasOne:

  • la première est la colonne dans le modèle actuel, la seconde est la classe liée, la troisième est la colonne dans le modèle associé

Donc, dans votre cas, il devrait être pour le client de classe:

$this->hasMany(
    'id', 
    'Invoice', 
    'customerId', 
    [ 
     'alias' => 'Invoices', // it's has many relations so better Invoices alias 
     'foreignKey' => [ 
      'message' => 'The customer cannot be deleted because other invoices are using it', 
     ] 
    ] 
); 

Dans la classe des factures:

$this->belongsTo('customerId', '\Customer', 'id', ['alias' => 'Customer']); 

Je ne sais pas si cela seul résoudre votre problème cependant.

+0

après la mise à jour de force mon modèle en utilisant 'php-devtools' il semble que le fichier de travail .... –