Por mais simples que seja, eu lutei um pouco com isso, pois não é explicitamente discutido nos documentos ( http://paris.readthedocs.org/en/latest/associations.html#has-many-through )
A ideia é que você tenha dois modelos com um has_many_through
relacionamento e um modelo intermediário para gerenciar esse relacionamento.
Um pouco de magia DB para ligar as coisas:
CREATE TABLE IF NOT EXISTS `Addresses` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `Users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `AddressUser` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`Addresses_id` int(11) NOT NULL,
`Users_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `id` (`id`),
KEY `Addresses_id` (`Addresses_id`),
KEY `Users_id` (`Users_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
ALTER TABLE `AddressUser`
ADD CONSTRAINT `AddressUser_ibfk_3` FOREIGN KEY (`Users_id`) REFERENCES `Users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
ADD CONSTRAINT `AddressUser_ibfk_4` FOREIGN KEY (`Addresses_id`) REFERENCES `Addresses` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
Os principais modelos:
// One side of the relationship
class User extends Model {
public static $_table = 'Users';
public function addresses() {
return $this->has_many_through('Address');
}
}
// Another side of the relationship
class Address extends Model {
public static $_table = 'Addresses';
public function users() {
return $this->has_many_through('User');
}
}
// Intermediate model for managing the relationship
class AddressUser extends Model {
public static $_table = 'AddressUser';
}
Em seguida, para criar uma associação ou vincular dois dos modelos principais:
$address_user = Model::factory('AddressUser')->create();
$address = Model::factory('Address')->find_one($address_id);
$user = Model::factory('User')->find_one($user_id);
// Just to make sure these entities actually exist in the db
if ($address && $user) {
$address_user->addresses_id = $address->id;
$address_user->users_id = $user->id;
$address_user->save();
}
Neste ponto, você deve ser capaz de criar novas linhas na AddressUser
tabela que se vinculem aos modelos corretos nas respectivas tabelas Addresses
e Users
.