نوع التعيين في Doctrine 2 DBAL
-
20-12-2019 - |
سؤال
أنا أستخدم فقط جزء DBAL من Doctrine لمشروعي.لذلك يجب أن أهتم برسم الخرائط بنفسي.لقد اكتشفت أن Doctrine يعيد تعيين أنواع قواعد البيانات إلى نوع PHP عام كما يمكنك أن تقرأ هنا [1].
لقد اكتشفت الآن حقيقة أن Doctrine يقوم بتعيين نوع قاعدة البيانات TinyInt(4) إلى Boolean.وفقًا لدليل MySQL، فإن TinyInt(1) فقط هو المكافئ لـ Boolean [2].نظرًا لأن مشروعي هو مشروع قديم أرغب في نقله من mysqli إلى Doctrine، فأنا بحاجة إلى الالتزام بأنواع قاعدة البيانات الأصلية.
سؤالي الآن هو كيف يمكنني إخراج نوع قاعدة البيانات الأصلي من Doctrine؟
شكرا مقدما لمساعدتكم.
ستيفانو
[1] http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html [2] http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
المحلول
أعتزم تقريرا في تعقب مشكلة العقيدة لمعرفة سبب عمل العقيدة من هذا القبيل.الجواب بسيط:
طول tinyint لا يقول أي شيء عن حجم القيمة التي يمكن تخزينها.في أي حال من الأحوال 1 بايت، لكنها تؤثر على Zeros ملء في حالة استخدام هذا الخيار لحقلك.
Mactrine خرائط نوعه المنطقي الخاص به إلى نوع Tinyint MySQL لأن MySQL لا توفر نوع منطقي خاص به.
لمزيد من المعلومات، يمكنك قراءة المزيد عن التذكرة:
href="http://www.doctrine-project.org/jira/browse/dbal-781" rel="nofollow"> http://www.doctrine-project.org/jira/browse/DBAL-781
نصائح أخرى
بالنسبة لأولئك الذين يقومون بتعيين قاعدة بيانات MySQL القديمة وفقًا للعقيدة، فقد وجدت حلاً لمشكلة شائعة يسهل تفويتها عند التعامل مع TINYINT(4)
ليرة تركية؛ د
يتغير default: '1'
في رسم الخرائط الميدانية ل
is_active:
type: boolean
options:
default: true
nullable: true
نسخة طويلة
كان لدي بنية قاعدة البيانات التالية في قاعدة البيانات القديمة، يرجى ملاحظة ذلك تاينينت(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
انتهى بي الأمر مع فرق في حين
ALTER TABLE foo_table CHANGE is_active is_active TINYINT(1) DEFAULT NULL;
لم أتمكن من إجراء أي تعديل على قاعدة البيانات الحالية (ولكن حتى القيام بذلك لم يحل المشكلة، كنت لا أزال أتلقى هذا الاختلاف)
يحتوي تعيين 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) بشكل صحيح