Cakephp 1.3.4 $ مشكلة في جدول العلاقة
-
25-09-2019 - |
سؤال
لدي جدول يسمى user_relationship. التي تحتوي على مفتاحين أجنبيين يشيران إلى جدول المستخدم لتعيين أنهما أصدقاء.
CREATE TABLE `user_relationships` (
`id` int(11) unsigned NOT NULL auto_increment,
`status` varchar(255) default 'pending',
`time` datetime default NULL,
`user_id` int(11) unsigned NOT NULL,
`friend_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_user_relationships_users1` (`user_id`),
KEY `fk_user_relationships_users2` (`friend_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
عندما أحاول أن أخبزها بشكل طبيعي ، لا يفهم أن Friend_ID يجب أن يشير إلى وحدة المستخدم. أريد تعديل الكود يدويًا ولكن أو لدي مشكلة في فهم الأجزاء التي يجب تعديلها في ما يلي
var $belongsTo = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Friend' => array(
'className' => 'Friend',
'foreignKey' => 'friend_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
في هذا الجزء من الرمز الذي أريد إحالة Friend_id إلى جدول المستخدم
'Friend' => array(
'className' => 'Friend',
'foreignKey' => 'friend_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
حاولت القيام بذلك .. هل أحتاج إلى تغيير أي شيء آخر؟
'Friend' => array(
'className' => 'Friend',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
المحلول
وماذا عن هذا؟
class UserRelationship {
var $belongsTo = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id'
),
'Friend' => array(
'className' => 'User',
'foreignKey' => 'friend_id'
)
);
}
class User {
var $hasAndBelongsToMany = array(
'Friend' => array(
'className' => 'User',
'joinTable' => 'user_relationships',
'foreignKey' => 'user_id',
'associationForeignKey' => 'friend_id',
'with' => 'UserRelationship'
)
);
}
يمكن رؤية الجمعيات من وجهات نظر مختلفة:
User <- Relationship -> User
| | |
hasMany belongsTo |
Relationship <- User (user_id) hasMany
| User (friend_id) -> Relationship
| |
HABTM HABTM
User <----------------------> User
تخطيطك "المادي" ، أي مخطط قاعدة البيانات User -> Relationship -> User
. علاقتك الحقيقية المطلوبة هي أ User -> User
علاقة رغم ذلك. من الناحية الفنية التي تترجم إلى أ User hasAndBelongsToMany User
جمعية (تسمى أيضا العديد من العدد). نظرًا لأنه يستخدم ثلاثة نماذج ، يمكن تقسيم جمعية كثيرة إلى: إلى:
- علاقة المستخدم/العلاقة Hasmany تنتمي إلى مستخدم
- العلاقة تنتمي إلى المستخدم/المستخدم العلاقة hasmany
لم تكن بحاجة إلى جمعية Hasandbelongstomany ، لكنها ما تريده بالفعل. لا تحتاج حقًا إلى نموذج العلاقة على الإطلاق ، لأنه مجرد نموذج مساعد لتوصيل المستخدمين ، ولكن إذا كنت فعل تريد تحديد ارتباطاتها أيضًا ، لديها جمعيات تنتمي.
نصائح أخرى
اسم الفصل الخاص بك لـ "صديق" خاطئ. نظرًا لأنه ليس لديك "أصدقاء" لا يوجد "صديق" نموذج ولديك الرجوع إلى "المستخدم" لأنهم يشاركون نفس الجدول.
'Friend' => array(
'className' => 'User',
'foreignKey' => 'friend_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
تمكنت من الابتعاد عن ما يلي:
class User extends AppModel {
var $hasAndBelongsToMany = array(
'Friends1' => array(
'className' => 'User',
'joinTable' => 'friends',
'foreignKey' => 'user_id',
'associationForeignKey' => 'friend_id',
'with' => 'Friend'
),
'Friends2' => array(
'className' => 'User',
'joinTable' => 'friends',
'foreignKey' => 'friend_id',
'associationForeignKey' => 'user_id',
'with' => 'Friend'
)
);
function afterFind(array $results) {
// Merge both sides of the relationship into one alias
foreach ($results as $key=>$result) {
if (isset($result["Friends1"]) && isset($result["Friends2"])) {
$results[$key]["Friends"] = array_merge($result["Friends1"], $result["Friends2"]);
unset($results[$key]["Friends1"]);
unset($results[$key]["Friends2"]);
}
}
إنه فوضوي ، لكنك تحصل على الفكرة: احصل على جانبي العلاقة ، ثم دمجهما بعد قراءة قاعدة بيانات :)