ما هي أفضل طريقة لإنشاء علاقة tableA HABTM tableA لتطبيق CakePHP؟
-
03-07-2019 - |
سؤال
أحتاج إلى إنشاء وظيفة للسماح للمستخدمين المسجلين بربط أنفسهم باستخدامات أخرى وتكوين عائلة.تبدو جداول قاعدة البيانات الخاصة بي كما يلي:
db.persons - (بوب، جين، تيمي، الخ)
- بطاقة تعريف
- اسم
- بريد إلكتروني
db.persons_persons
- بطاقة تعريف
- person__id_parent
- person_id_child
- Relationtype_id
db.relationtypes - (الزوج، الطفل، ابن الأخ، الخ)
- بطاقة تعريف
- اسم
باستخدام هذه البنية، يجب أن أكون قادرًا على تحديد أن بوب هو زوج جين في جدول الأشخاص_الأشخاص.سيبدو السجل في db.persons_persons كما يلي (psuedo):
ID | person_parent | person_child | relationtype
1 | Bob | Jane | Spouse
2 | Bob | Timmy | Child
أدرك أن هذا قد يتسبب في بعض تجزئة البيانات لأنه إذا كان بوب وجين متزوجين، فيجب أن يرتبط طفل أحدهما بالآخر.لكن هذا ليس سؤالي.سؤالي هو ما إذا كان إعداد قاعدة البيانات هذا "الأكثر صحة" للاستخدام في تطبيق cakePHP أم لا.
المحلول
أولاً، سوف يقوم CakePHP تلقائيًا بتبديل a people
الجدول في أ people
وحدة تحكم و person
نموذج، لذلك لا تحتاج إلى تسميته persons
.ثم سأتصل بجدول البحث relationships
بدلا من persons_persons
.
سأستدعي الحقول في جدول العلاقات الخاص بك person_id
, relation_id
و relation_type_id
, ، ثم قم بإضافة الشرطة السفلية في الخاص بك relationtypes
اسم الجدول حتى يصبح relation_types
.
أعتقد أن هذا أكثر دلالة.
لا يزال بإمكانك استخدام اقتران hasAndBelongsToMany والاستفادة من السحر التلقائي "مع"الارتباطات التي تقدمها CakePHP (1.2 فقط) للوصول إلى البيانات الإضافية في جدول HABTM لنوع العلاقة.
ومع ذلك، سأميل إلى استخدام:
Person
hasManyRelation
Relation
ينتمي إلىPerson
,Relation
,RelationType
في تطبيقك، هل العلاقة بين الأشخاص متضمنة ضمنيًا في علاقة شخص آخر بهم؟أي.إذا وجدت Person.id = 1 فقد تحصل على جميع علاقاتهم، على سبيل المثال.معرف الشخص 2 و3 و4.ولكن إذا وجدت Person.id 2، فلن تحصل تلقائيًا على Person.id = 1، ما لم يكن هناك سجل آخر في جدول العلاقات يمثل تلك العلاقة.
لتحقيق ذلك، يمكنك إعداد جمعية أخرى:
Person
hasManyRelation1
مع المفتاح الأجنبيperson_id
Person
hasManyRelation2
مع المفتاح الأجنبيrelation_id
Relation
ينتمي إلىPerson
,Relation
,RelationType
لاحظ أنه يمكنك تحقيق هذه العلاقة المزدوجة مع HABTM أيضًا.