Pregunta

Tengo un cliente con una base de datos que tiene varios modelos considerables e interrelacionales. Nos hemos encontrado con un extraño "error" en una relación $ hasone que estamos produciendo. El problema es este:

Model UserSitems tiene una relación $ hasone con los usuarios. Es como sigue

var $hasOne = array(
    'Author' => array(
        'className' => 'User',
        'foreignKey' => 'id'
    )
);

Esto extrae y se une a los datos del usuario con el "autor" de alias para estos elementos (que también pertenecen a los usuarios en el contexto de los usuarios que los han seleccionado para "marcadores").

Si el usuario tiene un id de, digamos, 3445 (más en el medio del rango del tamaño actual de la tabla), se extiende bien.

Sin embargo, si un usuario tiene, digamos un id de 5000 (el rango superior del tamaño actual de la tabla), ese $ Hasone no puede extraer ninguna información de un find(). En consecuencia, parece que los elementos "marcados" más nuevos no recuperan los datos del autor, mientras que otros ("mayores") están bien.

¿Qué estaría causando esto?

Información agregada

La consulta es la siguiente:

SELECT `UsersItem`.`id`, `UsersItem`.`user_id`, `UsersItem`.`item_id`,
       `UsersItem`.`in_list`, `User`.`id`, `User`.`username`, `User`.`password`,
       `User`.`email`, `User`.`group_id`, `User`.`resethash`, `User`.`confirmhash`,
       `User`.`confirmed`, `Item`.`id`, `Item`.`user_id`, `Item`.`name`,
       `Item`.`category_id`, `Item`.`description`, `Item`.`pagelink`,
       `Item`.`purchaselink`, `Item`.`moderated`, `Item`.`image_filename`,
       `Item`.`votecount`, `Item`.`parent_id`, `Item`.`discover_order`,
       `Item`.`created`, `Item`.`slug`, `Item`.`normalized_name`,
       ((`Item`.`votecount`)/pow((3600*TIMEDIFF(`Item`.`created`, NOW()) + 12), .42)) AS `Item__rank`,
       `Author`.`id`, `Author`.`username`, `Author`.`password`, `Author`.`email`,
       `Author`.`group_id`, `Author`.`resethash`, `Author`.`confirmhash`,
       `Author`.`confirmed`
FROM `users_items` AS `UsersItem`
LEFT JOIN `users` AS `User` ON (`UsersItem`.`user_id` = `User`.`id`)
LEFT JOIN `items` AS `Item` ON (`UsersItem`.`item_id` = `Item`.`id`)
LEFT JOIN `users` AS `Author` ON (`Author`.`id` = `UsersItem`.`id`)
WHERE `UsersItem`.`user_id` = 1118
  AND `UsersItem`.`in_list` = 1
ORDER BY `UsersItem`.`id` DESC

Segundo complemento

Esta consulta lo hace trabajar:

SELECT `UsersItem`.`id`, `UsersItem`.`user_id`, `UsersItem`.`item_id`, `UsersItem`.`in_list`, `User`.`id`, `User`.`username`, `User`.`password`, `User`.`email`, `User`.`group_id`, `User`.`resethash`, `User`.`confirmhash`, `User`.`confirmed`, `Item`.`id`, `Item`.`user_id`, `Item`.`name`, `Item`.`category_id`, `Item`.`description`, `Item`.`pagelink`, `Item`.`purchaselink`, `Item`.`moderated`, `Item`.`image_filename`, `Item`.`yeekcount`, `Item`.`parent_id`, `Item`.`discover_order`, `Item`.`created`, `Item`.`slug`, `Item`.`normalized_name`, ((`Item`.`yeekcount`)/pow((3600*TIMEDIFF(`Item`.`created`, NOW()) + 12), .42)) AS `Item__rank`, `Author`.`id`, `Author`.`username`, `Author`.`password`, `Author`.`email`, `Author`.`group_id`, `Author`.`resethash`, `Author`.`confirmhash`, `Author`.`confirmed` FROM `users_items` AS `UsersItem` LEFT JOIN `users` AS `User` ON (`UsersItem`.`user_id` = `User`.`id`) LEFT JOIN `items` AS `Item` ON (`UsersItem`.`item_id` = `Item`.`id`) LEFT JOIN `users` AS `Author` ON (`Author`.`id` = `Item`.`user_id`) WHERE `UsersItem`.`user_id` = 1118 AND `UsersItem`.`in_list` = 1 ORDER BY `UsersItem`.`id` DESC

Tenga en cuenta la diferencia en este bit en particular:

LEFT JOIN `users` AS `Author` ON (`Author`.`id` = `Item`.`user_id`)

Estaba tirando el mal id Como la identificación del autor anteriormente, entonces sé que ese era el problema; Ahora estoy tratando de descubrir cómo conseguir que el pastel genere esta consulta correcta ...

¿Fue útil?

Solución 3

Ninguna de las respuestas aquí funcionó para mí. Para bien o para mal, lo que terminé haciendo fue crear un campo virtual que poblaría el valor del nombre del autor.

El problema con el modelo de relaciones es que solo se aplican cuando llama a través del modelo en cuestión. En mi caso, no hay (y no debería haber) ninguna relación entre la tabla de usuarios y el nombre de la persona que escribió el artículo en cuestión.

Las tablas virtuales se llaman en cada instancia de la apariencia de ese modelo. Eso significa que, incluso en la relación de usuarios-> elementos, elementos voluntad Uplamen sus campos virtuales.

Lo que terminé creando en el archivo de modelo item.php se parecía a algo como:

var $virtualFields = array(
    'author' => 'SELECT `username` FROM `users` WHERE `id = Item.user_id`'
);

Esperaré para recibir noticias de otros sobre si esta es una solución adecuada para este problema, pero es el único hasta ahora que ha funcionado para mí. Porque no hay asociado author_id Columna En la tabla UserSitems, simplemente no veo cómo sería posible relacionar las dos tablas.

Otros consejos

Tal vez debería cambiar la relación del autor con pertenencia en lugar de hasone en su modelo de elemento como este:

var $BelongsTo= array(
'Author' = array(
    'className' => 'User',
    'foreignKey' => 'user_id');

la libro Explíquelo muy bien, la clave del extranjero en la relación perteneciente es lo que necesita:

ExtrayKey: el nombre de la clave extranjera que se encuentra en el modelo actual. Esto es especialmente útil si necesita definir múltiples relaciones pertenecientes. El valor predeterminado para esta clave es el nombre singular subrayado del otro modelo, sufijo con '_id'.

Espero haber ayudado :).

Si entendí su consulta correctamente, su asociación debería haber sido así:

En el modelo de usuario:

var $belongsTo= array(
    'User', 'Item'
);

En el modelo de elemento:

var $hasMany = array(
    'UserItem'
);

var $hasOne = array(
    'Author' = array(
        'className' => 'User',
        'foreignKey' => 'id'
);

Espero que esto ayude.

Mi suposición salvaje es que en algún momento las ID del autor y el usuario se han quedado sin sincronización, es decir, ID de autor del autor 3445 ID de usuario Hasone 3445 pero Author ID 5000 Hasone UserItem 5001 o algo así, y la consulta intenta obtener la identificación de una tabla incorrecta. Pero sin ver las consultas generadas es difícil de decir.

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