يتوفر cakephp hasAndBelogsToMany باستخدام حفظ() مقابلsaveAll()
-
02-07-2019 - |
سؤال
أنا باستخدام جدا الجوهرية قاعدة البيانات مع للكيك التطبيق حتى الآن نماذج متعددة الآراء و التحكم تعمل بشكل جيد.لدي المفرد الجدول (Entity
) أن يكون ذلك في id
على العديد من الجداول الأخرى الأجنبية الرئيسية entity_id
بعض الجداول هي واحدة العلاقات (مثل Company
هو واحد Entity
) و بعض هي واحدة من العديد من (Entity
يمكن أن يكون العديد من Addresses
) وهلم جرا.
لن/لا يمكن تغيير قاعدة بيانات نموذج, لذلك هذا هو الهيكل.
لقد تم استخدام saveAll()
لحفظ البيانات في هذه الجداول مع إدخال أسماء مثل:
Entity.type='x' (hidden inside the view)
Company.name
Address.0.street
Address.0.city
Address.1.street
Address.1.city
... and so on ...
و حفظ جميع يفعل كل العمل الشاق, BEGIN TRANSACTION
, كل INSERT
s نهائيا COMMIT
...
ولكن الآن لقد خلق EntityCategory
أن ن أن ن العلاقة وخلق كامل HABTM
العلاقة داخل النموذج.
يعمل عندما save()
ولكن فقط HABTM
علاقة ، فإنه يحفظ كل شيء عندما استخدم saveAll()
(تماما كما كان من قبل) باستثناء HABTM
علاقة.
أنا في عداد المفقودين شيئا ؟ كيف جعل هذا العمل بشكل صحيح ؟ أنا باستخدام التعليمات البرمجية التالية اليوم:
if (!empty($this->data)) {
$this->Entity->saveAll($this->data);
$this->Entity->save($this->data);
}
على saveAll()
يحفظ جميع البيانات في عدة جداول ، يحفظ الهوية في Entity->id
و save()
يحفظ HABTM
العلاقات, ولكن لست متأكدا إذا كان صحيحا أو إذا كان يمكن أن تجلب لي المشاكل إذا قمت بتغيير بعض هيكل/نموذج.
هذا هو أفضل طريقة لاستخدامه ؟ هل هناك الصحيح طريقة لحفظ أن العلاقات داخل للكيك ?ما الخبرة/المعرفة يمكن أن تقول لي ؟
المحلول
هذا هو ثابت إذا كنت تحميل ليلا.
كن حذرا على الرغم من أي شيء آخر قد كسر.
نصائح أخرى
المشكلة مع saveAll() و HABTM الجمعيات هو معروف يتوفر cakephp المسألة, و لم يتم البت 1.2 RC2.
كما fas كما أفضل راغبا في إنقاذ ذات الصلة نموذج البيانات المثل ، وفقا يتوفر cakephp كتاب الطبخ:
"عند العمل مع النماذج المرتبطة ، من المهم أن ندرك أن توفير نموذج البيانات ينبغي دائما أن يتم عن طريق المقابلة للكيك نموذج.إذا كنت تقوم بحفظ وظيفة جديدة وما يرتبط به من تعليقات ، ثم يمكنك استخدام كل وظيفة التعليق نماذج أثناء عملية الحفظ."
ومع ذلك ، باستخدام saveAll() وحفظ() يجب أن تعمل ، IMHO هو أكثر مرونة/عام الحل.