سؤال

أنا أستخدم فقط جزء 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) بشكل صحيح

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top