Doctrine 2 Dbal에서의 형식 매핑
-
20-12-2019 - |
문제
나는 프로젝트를 위해 교리의 dbal 부분만을 사용하고 있습니다. 그래서 나는 자신을 매핑하는 것을 돌봐야합니다. 나는 여기에서 읽을 수 있듯이 Doctrin은 데이터베이스 유형을 일반적인 PHP 유형으로 다시 매핑한다는 것을 알아 냈습니다. [1].
이제 DOCTRINE이 DB TYPE TINYINT (4)를 부울로 맵핑한다는 사실을 발견했습니다. MySQL 매뉴얼에 따르면 TinyInt (1)만이 부울 [2]과 동일합니다. 내 프로젝트는 MySQLI에서 Doctrine로 이동하기를 원하는 레거시 인이므로 기본 DB 유형을 고정시켜야합니다.
내 질문은 현재 Doctrine에서 네이티브 DB 유형을 얻는 방법입니다.
에 대한 사전에 도움을 주셔서 감사합니다.
stefano
[1] http : // docs .doctrine-project.org / projects / doctrine-dbal / en / 최신 / 참조 / types.html [2] http://dev.mysql.com/ DOC / REFMAN / 5.0 / en / numeric-type-overview.html
해결책
Doctrine 이슈 트래커에서 보고서를 opend하여 교리가 왜 그렇게 작동 하는지를 알아냅니다.대답은 간단합니다 :
Tinyint의 길이는 저장할 수있는 값의 크기에 대해 아무 것도 말하지 않습니다.어떤 경우 1 바이트에 있지만 필드 에이 옵션을 사용하는 경우에 충전 된 0을 충전하십시오.
교리는 MySQL이 자신의 부울 유형을 제공하지 않기 때문에 자신의 부울 유형을 MySQL Tinyint 유형으로 매핑합니다.
자세한 내용은 티켓에 대한 자세한 내용을 더 읽을 수 있습니다.
"Noofollow"> http://www.doctrine-project.org/jira/browse/DBAL-781
다른 팁
레거시 MySQL DB를 교리에 매핑하는 사람들은 Tinyint (4)
를 다룰 때 놓치기 쉽기 쉽습니다.TL; DR
필드 맵핑에서 default: '1'
변경
is_active:
type: boolean
options:
default: true
nullable: true
.
긴 버전
레거시 DB에서 다음 DB 구조가 있었는데, tinyint (4) is_active
열
CREATE TABLE IF NOT EXISTS `foo_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
...
`is_active` tinyint(4) DEFAULT '1',
...
.
다음 명령을 실행 한 후
php app/console doctrine:mapping:import --force AcmeDemoBundle yml
php app/console doctrine:generate:entities AcmeDemoBundle
.
및 php app/console doctrine:schema:update --dump-sql
를 실행하는 동안
나는 diff로 끝났다
ALTER TABLE foo_table CHANGE is_active is_active TINYINT(1) DEFAULT NULL;
.
기존 DB에 대한 수정을 할 수 없었지만 문제는 문제를 해결하지 못했습니다, 나는 여전히이 diff를 얻었습니다.
yml 매핑은 다음 필드 정의
is_active:
type: boolean
nullable: true
default: '1'
column: is_active
.
로 시도했습니다.
is_active:
columnDefinition: "TINYINT(4)"
nullable: true
default: '1'
column: is_active
.
성공하지 않고 프로그래밍 "에서 매우 공통된 규칙을 따르십시오."코드에 문제가 없으면 문제가 어딘가에 " 솔루션을 발견했습니다
솔루션
is_active:
type: boolean
options:
default: true
nullable: true
.
이제는 단순히 type: boolean
를 사용하는 경우에도 tinyint (4)를 올바르게 인식합니다