CakePhp 1.3.4 $
-
25-09-2019 - |
Frage
Ich habe eine Tabelle namens user_relationship. Dies hat zwei Fremdschlüsse, die sich auf die Benutzertabelle beziehen, um die Freunde zuzubereiten.
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 ;
Wenn ich versuche, es zu backen, versteht es natürlich nicht, dass sich das Freund_id auf das Benutzermodul beziehen muss. Ich möchte den Code manuell bearbeiten, aber ich habe ein Problem damit, zu verstehen, welche Teile im Folgenden zu bearbeiten sind
var $belongsTo = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Friend' => array(
'className' => 'Friend',
'foreignKey' => 'friend_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
In diesem Teil des Codes möchte ich den Freund_ID an die Benutzertabelle verweisen
'Friend' => array(
'className' => 'Friend',
'foreignKey' => 'friend_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
Ich habe versucht, dies zu tun. Muss ich noch etwas ändern?
'Friend' => array(
'className' => 'Friend',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
Lösung
Wie wäre es damit?
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'
)
);
}
Assoziationen sind aus verschiedenen Gesichtspunkten zu sehen:
User <- Relationship -> User
| | |
hasMany belongsTo |
Relationship <- User (user_id) hasMany
| User (friend_id) -> Relationship
| |
HABTM HABTM
User <----------------------> User
Ihr "physisches" Layout, dh Datenbankschema, ist User -> Relationship -> User
. Ihre wirklich gewünschte Beziehung ist eine User -> User
Beziehung allerdings. Technisch bedeutet das in a User hasAndBelongsToMany User
Assoziation (auch viele zu viele genannt). Da es drei Modelle verwendet, kann ein vielen zu viele Assoziationen unterteilt werden in:
- Benutzer Hasmany -Beziehung/Beziehung hingehörniger Benutzer
- Beziehung hör
Du nicht brauchen Die Hasandbelongstomany Association, aber es ist das, was Sie eigentlich wollen. Sie brauchen das Beziehungsmodell überhaupt nicht wirklich, da es sich nur um ein Helfermodell handelt, um die beiden Benutzer zu verbinden, aber wenn Sie tun Sie möchten auch seine Assoziationen angeben, es hat zwei Hingasto -Assoziationen.
Andere Tipps
Ihr Klassenname für "Freund" ist falsch. Da Sie keine Tabelle "Freunde" haben, gibt es keinen Modell "Freund" und Sie haben die "Benutzer" auf die Klasse "Benutzer", da sie dieselbe Tabelle teilen.
'Friend' => array(
'className' => 'User',
'foreignKey' => 'friend_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
Ich konnte mit Folgendem davonkommen:
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"]);
}
}
Es ist chaotisch, aber Sie haben die Idee: Schnappen Sie sich beide Seiten der Beziehung und fusionieren Sie sie dann nach einer Datenbank gelesen :)