Класс должен быть дочерним классом ошибки Doctrine_Record в доктрине php symfony:insert-sql

У меня проблема с генерацией моих таблиц с помощью команды:

php symfony doctrine:insert-sql

Это возвращает мне следующую ошибку:

>> doctrine  creating tables


  Class "Complaint" must be a child class of Doctrine_Record


PHP Fatal error:  Call to a member function evictAll() on a non-object in D:\Internet\PHP\ijzerleeuw_bezoekrapporten\lib\vendor\symfony\lib\plugins\sfDoctri
nePlugin\lib\vendor\doctrine\Doctrine\Connection.php on line 1239
PHP Stack trace:
PHP   1. {main}() D:\Internet\PHP\ijzerleeuw_bezoekrapporten\symfony:0
PHP   2. include() D:\Internet\PHP\ijzerleeuw_bezoekrapporten\symfony:14
PHP   3. sfDatabaseManager->shutdown() D:\Internet\PHP\ijzerleeuw_bezoekrapporten\lib\vendor\symfony\lib\database\sfDatabaseManager.class.php:0
PHP   4. sfDoctrineDatabase->shutdown() D:\Internet\PHP\ijzerleeuw_bezoekrapporten\lib\vendor\symfony\lib\database\sfDatabaseManager.class.php:134
PHP   5. Doctrine_Manager->closeConnection() D:\Internet\PHP\ijzerleeuw_bezoekrapporten\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\database\sfDoctr
ineDatabase.class.php:165
PHP   6. Doctrine_Connection->close() D:\Internet\PHP\ijzerleeuw_bezoekrapporten\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrin
e\Manager.php:580
PHP   7. Doctrine_Connection->clear() D:\Internet\PHP\ijzerleeuw_bezoekrapporten\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrin
e\Connection.php:1268

Это мой schema.yml, который я использовал для генерации модели (доктрина php symfony:build-mdeol):

InspectionReport:
  actAs: { Timestampable: ~ }
  columns:
    customer_id:    { type: integer(5), notnull: true }
    username:       { type: string(255), notnull: true }
    start_time:     { type: string(5) }
    end_time:       { type: string(5) }
    type:           { type: string(5) }
    reason:         { type: string(4) }
    contact:        { type: string(5) }
    subject:        { type: string(5) }
    remarks:        { type: string(5000) }
    emailaddresses: { type: string(5) }
  relations:
    Complaints:
      class: Complaint
      refClass: ComplaintInspectionReport
      local: id
      foreign: complaint_id
    Reviews:
      class: Review
      refClass: ReviewInspectionReport
      local: id
      foreign: review_id

ComplaintInspectionReport:
  columns:
    complaint_id:  { type: integer(4), primary: true }
    inspection_report_id: { type: integer, primary: true }
  relations:
    Complaint:  { onDelete: CASCADE, local: complaint_id, foreign: id }
    InspectionReport: { onDelete: CASCADE, local: inspection_report_id, foreign: id }

ReviewInspectionReport:
  columns:
    review_id:  { type: integer, primary: true }
    inspection_report_id: { type: integer, primary: true }
  relations:
    Review:  { onDelete: CASCADE, local: review_id, foreign: id }
    InspectionReport: { onDelete: CASCADE, local: inspection_report_id, foreign: id }

Complaint:
  columns:
    id:            { type: integer, notnull: true }
    description:   { type: string(32), notnull: true }
    contact:       { type: string(32) }
    remark:        { type: string(50) }

Review:
  columns:
    id:            { type: integer, notnull: true }
    description:   { type: string(32), notnull: true }
    contact:       { type: string(32) }
    remark:        { type: string(50) }
    grade:         { type: string(1) }
    email_address: { type: string(32) }

И schema.sql, который я сгенерировал из модели / схемы (доктрина php symfony:build-sql):

CREATE TABLE complaint (id BIGINT AUTO_INCREMENT, description VARCHAR(32) NOT NULL, contact VARCHAR(32), remark VARCHAR(50), PRIMARY KEY(id)) ENGINE = INNODB;
CREATE TABLE complaint_inspection_report (complaint_id INT, inspection_report_id BIGINT, PRIMARY KEY(complaint_id, inspection_report_id)) ENGINE = INNODB;
CREATE TABLE inspection_report (id BIGINT AUTO_INCREMENT, customer_id BIGINT NOT NULL, username VARCHAR(255) NOT NULL, start_time VARCHAR(5), end_time VARCHAR(5), type VARCHAR(5), reason VARCHAR(4), contact VARCHAR(5), subject VARCHAR(5), remarks TEXT, emailaddresses VARCHAR(5), created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY(id)) ENGINE = INNODB;
CREATE TABLE review (id BIGINT AUTO_INCREMENT, description VARCHAR(32) NOT NULL, contact VARCHAR(32), remark VARCHAR(50), grade VARCHAR(1), email_address VARCHAR(32), PRIMARY KEY(id)) ENGINE = INNODB;
CREATE TABLE review_inspection_report (review_id BIGINT, inspection_report_id BIGINT, PRIMARY KEY(review_id, inspection_report_id)) ENGINE = INNODB;
ALTER TABLE complaint_inspection_report ADD CONSTRAINT complaint_inspection_report_complaint_id_complaint_id FOREIGN KEY (complaint_id) REFERENCES complaint(id) ON DELETE CASCADE;
ALTER TABLE complaint_inspection_report ADD CONSTRAINT ciii FOREIGN KEY (inspection_report_id) REFERENCES inspection_report(id) ON DELETE CASCADE;
ALTER TABLE review_inspection_report ADD CONSTRAINT riii FOREIGN KEY (inspection_report_id) REFERENCES inspection_report(id) ON DELETE CASCADE;
ALTER TABLE review_inspection_report ADD CONSTRAINT review_inspection_report_review_id_review_id FOREIGN KEY (review_id) REFERENCES review(id) ON DELETE CASCADE;

Если я запускаю SQL вручную, он работает нормально, но при использовании doctrine: insert-sql он возвращает мне ошибки.

Я думаю об ошибке в моей схеме, но, похоже, не могу ее исправить. Или, может быть, это что-то совершенно другое.

1 ответ

Решение

Я был неправ, я просто генерировал классы и не пытался загрузить sql.

На самом деле у вас есть несколько ошибок:

  • Вы не должны определять столбец id для таблицы, только если вам не нужен первичный ключ, не увеличен и т. д., иначе это вызовет проблемы с доктриной
  • для каждой промежуточной таблицы (ComplaintInspectionReport & ReviewInspectionReportВы не должны переопределять relations, Если они правильно определены в родительском классе, они вам здесь не нужны
  • будь осторожен с integer тип. Учение всегда будет использовать integer но если вы определите иностранный с integer(4) что приводит к автоматическому сгенерированному Doctrine идентификатору, связь не будет установлена ​​при вставке sql. Потому что с одной стороны у вас есть integer а с другой integer(4),
  • наконец, будьте осторожны с local ключ, определенный в InspectionReport, Ты используешь id дважды, но вы должны определить локальный ключ для промежуточной таблицы, а не текущую. Так что вам придется установить inspection_report_id для обоих.

Вот фиксированная схема:

InspectionReport:
  actAs: { Timestampable: ~ }
  columns:
    customer_id:    { type: integer(5), notnull: true }
    username:       { type: string(255), notnull: true }
    start_time:     { type: string(5) }
    end_time:       { type: string(5) }
    type:           { type: string(5) }
    reason:         { type: string(4) }
    contact:        { type: string(5) }
    subject:        { type: string(5) }
    remarks:        { type: string(5000) }
    emailaddresses: { type: string(5) }
  relations:
    Complaints:
      class: Complaint
      refClass: ComplaintInspectionReport
      local: inspection_report_id
      foreign: complaint_id
    Reviews:
      class: Review
      refClass: ReviewInspectionReport
      local: inspection_report_id
      foreign: review_id

ComplaintInspectionReport:
  columns:
    complaint_id:  { type: integer, primary: true }
    inspection_report_id: { type: integer, primary: true }

ReviewInspectionReport:
  columns:
    review_id:  { type: integer, primary: true }
    inspection_report_id: { type: integer, primary: true }

Complaint:
  columns:
    description:   { type: string(32), notnull: true }
    contact:       { type: string(32) }
    remark:        { type: string(50) }

Review:
  columns:
    description:   { type: string(32), notnull: true }
    contact:       { type: string(32) }
    remark:        { type: string(50) }
    grade:         { type: string(1) }
    email_address: { type: string(32) }

Не забудьте очистить кеш, прежде чем пытаться заново вставить sql.

Другие вопросы по тегам