Pregunta

Supongamos que (a falta de una mejor ejemplo) Tengo un modelo de persona y otro modelo gemelo (que significa un par de gemelos). Los gemelos tiene dos claves externas persona, decir first_born_id y second_born_id referencia a los campos de ID de dos personas diferentes (en persona). ¿Cómo puedo configurar las relaciones en el pastel?

supongo gemelo tendría algo como:

$belongsTo = array('FirstBorn' => array('className' => 'Person',
                                        'foreignKey' => 'firstborn_id'),
                   'SecondBorn' => array('className' => 'Person',
                                         'foreignKey' => 'secondborn_id'));

Pero, ¿cómo debería configurar persona? Podría hacerlo como:

$hasOne = array('TwinAsFirstborn' => array('className' => 'Twin',
                                           'foreignKey' => 'firstborn_id'),
                'TwinAsSecondborn' => array('className' => 'Twin',
                                           'foreignKey' => 'secondborn_id'));

Pero cuando tengo una persona y quiero saber sobre su gemelo que tendría que comprobar ambas relaciones. Supongo que estoy esperando que hay una manera de conseguir una relación "gemela" en persona en representación de cualquiera de las dos maneras en que una persona puede estar en una relación gemela.

O hay una mejor manera de configurar esto?

¿Fue útil?

Solución

Estoy de acuerdo con el ejemplo gemelo ser un poco confuso. Déjame se supone que tiene un modelo Product (gemelo en su ejemplo) y siempre tiene 2 modelos Component conectados a él.

components: id - name
products: id - component1_id - component2_id

Yo establecería producto de la siguiente manera:

var $belongsTo = array(
    'Component1' => array(
        'className' => 'Component',
        'foreignKey' => 'component1_id'
    ),
    'Component2' => array(
         'className' => 'Component',
         'foreignKey' => 'component2_id'
    )
);

Y de componentes como:

var $hasMany = array(
    'ProductWithComponentAsComponent1' => array(
        'className' => 'Product',
        'foreignKey' => 'component1_id'
    ),
    'ProductWithComponentAsComponent2' => array(
        'className' => 'Product',
        'foreignKey' => 'component2_id'
    )
);

Básicamente, se deben sustituir los hasOne con hasMany. Cada componente hasMany productos en los que es el primer componente. Al mismo tiempo, se hasMany productos en los que es el segundo componente. Esperar que tiene las cosas claras.

EDIT 1: (.. Ah, y "ProductWithComponentAsComponent #" es sólo con el propósito de explicación Puede mantener lo cortas, alias dulces desea dependiendo de sus modelos reales)

EDIT 2: simple regla de oro para el uso de relaciones hasOne - Uso sólo está dividiendo una sola tabla en el que muchos (como usuario / perfil)

EDITAR. 3: Si desea que todos los productos para un componente, entonces usted puede hacer esto de dos maneras

(A) Definir el foreignKey como false en su relación hasMany.

var $hasMany = array(
    'Product' => array(
        'className' => 'Product',
        'foreignKey' => false,
        'conditions' => array(
            'or' => array(
                "Product.component1_id = Component.id",
                "Product.component2_id = Component.id"
            )
        )
    )
);

(B) Si el método anterior no funciona (torta actúa extraño de vez en cuando), también se puede utilizar una combinación para que sea obedecer. Crear una función en el modelo de componentes, así:

function fetchProducts($id) {
    if (!$id) {
        return null;
    }
    return $this->Product->find('all', array(
        'fields' => array('Product.*'),
        'joins' => array(
            array(
                'table' => 'components',
                'alias' => 'Component',
                'foreignKey' => false,
                'type' => 'inner',
                'conditions' => array(
                    'or' => array(
                        "Product.component1_id = Component.id",
                        "Product.component2_id = Component.id"
                    ),
                    'Component.id' => $id
                )
            )
        )
    ));
}

Otros consejos

¿Por qué definiría un gemelo así?

Un gemelo, primer o segundo hijo es una persona. Lo que los asocia a uno de los padres es el hecho de que son un "niño" y su "fecha de nacimiento" es el mismo.

Así que sería no hacer algo como:

Persona ->            CARNÉ DE IDENTIDAD,            Nombre,            Años,            fecha de nacimiento,            Parent_id

El parent_id se almacena en el registro del niño, y el gemelo se determina mediante la comparación de todos los niños menores de un padre por fecha de nacimiento?

¿Esto lo hace más fácil para configurar sus relaciones CakePHP?

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