CakePhp 1.3.4 $ Beliball Problema in caso di tabella delle relazioni
-
25-09-2019 - |
Domanda
Ho una tabella chiamata user_relationship. che ha due chiavi straniere che si riferiscono alla tabella dell'utente per mappare che sono amici.
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 ;
Quando provo a cuocerlo naturalmente non capisce che l'amico_id debba fare riferimento al modulo utente. voglio manuale modificare il codice ma o ho qualche problema a capire quali parti modificare nel seguente
var $belongsTo = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Friend' => array(
'className' => 'Friend',
'foreignKey' => 'friend_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
In questa parte del codice voglio fare riferimento all'amico_id alla tabella utente
'Friend' => array(
'className' => 'Friend',
'foreignKey' => 'friend_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
Ho provato a farlo .. Devo cambiare qualcos'altro?
'Friend' => array(
'className' => 'Friend',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
Soluzione
Cosa ne pensi di questo?
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'
)
);
}
Le associazioni possono essere viste da diversi punti di vista:
User <- Relationship -> User
| | |
hasMany belongsTo |
Relationship <- User (user_id) hasMany
| User (friend_id) -> Relationship
| |
HABTM HABTM
User <----------------------> User
Il tuo layout "fisico", cioè schema di database, è User -> Relationship -> User
. La tua vera relazione desiderata è un User -> User
relazione però. Tecnicamente questo si traduce in a User hasAndBelongsToMany User
Associazione (chiamata anche molti-to-many). Dal momento che utilizza tre modelli, un'associazione da molti a molti può essere suddivisa in:
- L'utente ha una relazione/relazione appartenente all'utente
- Relazione appartenta all'utente/utente hasmany relazione
Non lo fai bisogno L'Associazione Hasandbelongstomany, ma è quello che vuoi effettivamente. Non hai davvero bisogno del modello di relazione, poiché è solo un modello di aiuto per collegare i due utenti, ma se tu fare Vuoi specificare anche le sue associazioni, ha due associazioni di appartenenza.
Altri suggerimenti
Il tuo nome di classe per "amico" è sbagliato. Dal momento che non hai "amici" di "amici" non esiste un modello "amico" e hai il riferimento all'utente di classe "poiché condividono la stessa tabella.
'Friend' => array(
'className' => 'User',
'foreignKey' => 'friend_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
Sono stato in grado di cavartela con quanto segue:
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"]);
}
}
È disordinato, ma hai l'idea: prendi entrambi i lati della relazione, quindi uniscili dopo un database letto :)