2010-08-17 4 views
0

J'utilise symfony 1.4, et mon schéma est le suivant:pourquoi j'obtiens une erreur de contrainte?

Auditor: 
    columns: 
    id: 
     type: integer 
     autoincrement: true 
     primary: true 
    username: 
     type: string(255) 
    password: 
     type: string(255) 
    fullname: 
     type: string(255) 
    is_auditor: 
     type: integer 
    is_manager: 
     type: integer 
    is_director: 
     type: integer 

Task: 
    columns: 
    id: 
     type: integer 
     autoincrement: true 
     primary: true 
    client: 
     type: string(255) 
    start_date: 
     type: date 
    end_date: 
     type: date 
    assigned_by: 
     type: string(255) 
    comments: 
     type: string 
    status: 
     type: integer 
    relations: 
    Auditors: 
     foreignAlias: Tasks 
     class: Auditor 
     refClass: AuditorTask 

AuditorTask: 
    columns: 
    id: 
     type: integer 
     autoincrement: true 
     primary: true 
    auditor_id: 
     type: integer 
     primary: true 
    task_id: 
     type: integer 
     primary: true 
    relations: 
    Auditor: 
     foreignAlias: AuditorTasks 
    Task: 
     foreignAlias: AuditorTasks 

Expense: 
    columns: 
    id: 
     type: integer 
     autoincrement: true 
     primary: true 
    auditor_task_id: 
     type: integer 
    date: 
     type: date 
    hours_spent: 
     type: integer 
    transport_cost: 
     type: float 
    remarks: 
     type: string 
    relations: 
    AuditorTask: 
     foreignAlias: Expenses 

lorsque je tente de créer une nouvelle tâche, je reçois l'erreur suivante:

SQLSTATE [HY000]: Erreur générale: 1452 Impossible d'ajouter ou mettre à jour une ligne enfant: une contrainte de clé étrangère échoue

auditeur et a une tâche beaucoup à de nombreux rapports (ehrauditor_task, cONTRAINTE auditor_task_id_expense_auditor_task_id FOREIGN KEY (id) RÉFÉRENCES expense (auditor_task_id).) hanche. ainsi la table de jonction. les auditeurs peuvent avoir des commentaires concernant la tâche, donc j'utilise la relation un à plusieurs entre auditortask et les dépenses.

des idées?

ok voici une trace du débogage.

1 Info sfPatternRouting Match route "default" (/:module/:action/*) for /task/create with parameters array ('module' => 'task', 'action' => 'create',) 
2 Info sfFilterChain Executing filter "sfRenderingFilter" 
3 Info sfFilterChain Executing filter "sfExecutionFilter" 
4 Info taskActions Call "taskActions->executeCreate()" 
5 Info Doctrine_Connection_Mysql exec : SET NAMES 'UTF8' -() 
6 Info Doctrine_Connection_Statement execute : SELECT COUNT(*) AS num_results FROM auditor a WHERE a.id IN (?) - (1) 
7 Info Doctrine_Connection_Statement execute : SELECT a.id AS a__id, a.username AS a__username, a.password AS a__password, a.fullname AS a__fullname, a.is_auditor AS a__is_auditor, a.is_manager AS a__is_manager, a.is_director AS a__is_director FROM auditor a WHERE (a.id IN (?)) - (1) 
8 Info Doctrine_Connection_Statement execute : INSERT INTO task (client, start_date, end_date, assigned_by, comments, status) VALUES (?, ?, ?, ?, ?, ?) - (Falcon Limited, 2005-01-02, 2005-02-02, mr manager one, asap., 0) 
9 Info Doctrine_Connection_Statement execute : INSERT INTO auditor_task (auditor_id, task_id) VALUES (?, ?) - (1, 1) 
10 Error Doctrine_Connection_Mysql_Exception SQLSTATE[HY000]: General error: 1452 Cannot add or update a child row: a foreign key constraint fails (`ehr`.`auditor_task`, CONSTRAINT `auditor_task_id_expense_auditor_task_id` FOREIGN KEY (`id`) REFERENCES `expense` (`auditor_task_id`)) 
11 Info sfWebResponse Send status "HTTP/1.1 500 Internal Server Error" 
12 Info sfWebResponse Send header "Content-Type: text/html; charset=utf-8" 
+0

Obtenez-vous une trace de pile? Si oui, postez le s'il vous plait, sinon essayez d'en obtenir un ... – greg0ire

+0

Votre schéma schema.yml semble cassé: il devrait y avoir plus de sauts de ligne (avant les relations par exemple). Qu'avez-vous comme task_id pour la tâche nouvellement créée (la réponse devrait être 1). Et essayez d'obtenir plus de réputation (en remplissant votre profil, par exemple), afin que vous puissiez poster des commentaires. – greg0ire

+0

hé, désolé je n'ai pas remarqué qu'il soit si cassé. c'est seulement cassé quand je l'ai collé ici. sinon ce n'est pas cassé dans mon fichier actuel. Quelqu'un m'a dit que je ne suis pas censé avoir l'ID dans la table de jonction, mais c'est nécessaire pour la relation un à plusieurs. – han

Répondre

0

Il semble que ce soit la clé primaire que vous avez définie dans AuditorTask. Vous avez défini 'id', 'auditor_id' et 'task_id' comme PK. Retirez le PK-déclaration de « auditor_id » et « task_id » et les travaux suivants:

insert into auditor(username)values('user'); 
insert into task(client)values('The client'); 
insert into auditor_task(auditor_id, task_id)values(1,1); 
insert into expense(auditor_task_id, hours_spent)values(1,2); 

Pour référence, voici comment AuditorTask ressemble après la modification:

AuditorTask: 
    columns: 
    id: 
     type: integer 
     autoincrement: true 
     primary: true 
    auditor_id: 
     type: integer 
    task_id: 
     type: integer 
    relations: 
    Auditor: 
     foreignAlias: AuditorTasks 
    Task: 
     foreignAlias: AuditorTasks 

Je vois que vous utilisez MySQL Est-ce que MySQL vous a même laissé créer les tables comme elles ont été définies? Postgres (que j'utilise principalement) a vu que quelque chose était louche et n'a même pas accepté la création de table comme elle a été définie. ;)

Questions connexes