Pregunta

Me estoy moviendo hacia un ORM para mi aplicación CodeIgniter y he elegido DataMapper . Sin embargo, en el reglas , se establece lo siguiente:

  

debe existir una tabla de unión entre   cada uno tablas normales y con independencia   del tipo de relación.

Tengo docenas de tablas que están en un uno> muchos relación. ¿Significa esto que tengo que crear tablas intermedias (unión) entre cada uno de ellos como si fueran mucho-mucho?

¿Fue útil?

Solución

No, en realidad, el modelo que tiene un conjunto de relaciones $has_one tendrá un campo que termina en _id, que se refiere al objeto con el conjunto de relaciones $has_many.

Así, por ejemplo:

class Recipe extends DataMapper {
    var $has_many = array('product', 'rating', 'recipe_category');
    var $has_one = array('recipe_source', 'user');
    (...)
}

class Recipe_Source extends DataMapper {
    var $has_many = array('recipe');
    (...)
}

En este caso, DataMapper hizo una recipes tabla con una columna recipe_source_id, y una mesa de recipe_sources que no requería campos adicionales.

Ahora, para las relaciones muchos-a-muchos, una tabla de unión se creará y se sigue una convención estricta.

El nombre de la tabla se unen serán los dos plurales de los modelos unidas, separadas por un guión, en orden alfabético.

Por lo tanto, el uso de este modelo:

class Product extends DataMapper {
    var $has_one = array('cheese_style', 'butter_style', 'cheese_flavor');
    var $has_many = array('product_size', 'recipe');
    (...)
}

Ahora, termino con una tabla de unión en mi base de datos llamada products_recipes.

Esta es la forma en que es manejado por la biblioteca DMZ DataMapper ( http://www.overzealous.com/ DMZ / ), que se supone que es una gota en el reemplazo para la biblioteca stensi DataMapper de edad, así que voy a asumir las convenciones son los mismos.

A pesar de ello, le recomiendo hacer el cambio a DMZ.

Otros consejos

Los Nevers doc dice explícitamente en un solo lugar lo que debe hacer para evitar el uso de una tabla de unión para algo tan simple como una relación de uno a muchos. Recoja los pedazos de información en torno a la base de datos (tablas, creación de relaciones, relaciones avanzadas) y entiende que es posible sin que se muestra de cómo hacerlo.

Hay que crear la clave externa en la tabla secundaria utilizando el "_ID" convención sufijo y DataMapper reconocerán que automáticamente (al menos eso es lo que funcionó para mí ), suponiendo que configure los atributos has_one y has_many en los dos modelos. Como country_id en este ejemplo:

// class User extends DataMapper { var $has_one = array('country'); ... }
CREATE TABLE `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `country_id` int(10) unsigned NOT NULL,
    `username` varchar(20) NOT NULL,
    `password` varchar(50) NOT NULL,
    `confirm_password` varchar(50) NOT NULL,
    `email` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
)

// class Country extends DataMapper { var $has_many = array('user'); ... }
CREATE TABLE `countries` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(50) NOT NULL,
    PRIMARY KEY (`id`)
)

Sí, por desgracia, sí significa que. Esta es una de las razones por las que tenía que cambiar mi diseño DB

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top