Domanda

Sto cercando di fare una relazione molti-a-molti tra 2 modelli: Users_Role e Users_Right

class Model_Users_Role extends ORM{
    protected $_has_many = array(
        'rights' => array(
            'model'   => 'users_right',
            'through' => 'users_roles_rights',
        ),
    ); 
}

class Model_Users_Right extends ORM{    
    protected $_has_many = array(
        'roles' => array(
            'model'   => 'users_role',
            'through' => 'users_roles_rights',
        ),
    );
}

Sto cercando di farlo:

$role = ORM::factory('users_role', 1);
$right = ORM::factory('users_right', 1);
$right->add('roles', $role);

Errore:

Database_Exception [ 1054 ]: Unknown column 'role_id' in 'field list' [ INSERT INTO `users_roles_rights` (`users_right_id`, `role_id`) VALUES ('1', '1') ]

Ho provato a farlo dall'altra parte:

$role = ORM::factory('users_role', 1);
$right = ORM::factory('users_right', 1);        
$role->add('rights', $right);

Nuovo errore:

Database_Exception [ 1054 ]: Unknown column 'right_id' in 'field list' [ INSERT INTO `users_roles_rights` (`users_role_id`, `right_id`) VALUES ('1', '1') ]

Mi aspettavo che ORM usasse users_role_id e users_right_id Nomi dei campi nella tabella pivot, ma utilizza il nome errato della chiave lontana? Dove ho fatto un errore?

È stato utile?

Soluzione

Scopri dove il I valori predefiniti sono impostati. Prova questo:

class Model_Users_Role extends ORM{
    protected $_has_many = array(
        'rights' => array(
            'model'   => 'users_right',
            'far_key' => 'users_right_id',
            'through' => 'users_roles_rights',
        ),
    ); 
}

class Model_Users_Right extends ORM{    
    protected $_has_many = array(
        'roles' => array(
            'model'   => 'users_role',
            'far_key' => 'users_role_id',
            'through' => 'users_roles_rights',
        ),
    );
}

Kohana non verifica che la relazione non esista già.

Opponiamolo nella tabella del database con una chiave univoca composita sulle due colonne a chiave estera o fai verificare che il codice non esista già prima di aggiungere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top