Pregunta

Soy relativamente nuevo en CakePHP, y estoy escribiendo una aplicación de CakePHP que actualmente tiene un modelo de Autor y un modelo de Libro. El autor y el libro tienen una relación de muchos a muchos.
Sin embargo, me gustaría, además, para cada relación autor-libro, tener un enlace correspondiente al blog de ese autor donde reflexionen sobre sus experiencias al escribir ese libro.

Si eso fue confuso, los siguientes párrafos tratan de elaborar para aclarar mi situación:

Para cada autor, habrá un artículo sobre sus experiencias para cada libro. Para ver esta relación a la inversa, esto significa que para cada libro, habrá un enlace correspondiente, por autor (dado que los libros pueden tener varios autores), donde ese autor describe su experiencia al escribir el libro.

En otras palabras, para cada par (Autor, Libro), me gustaría poder almacenar una URL relacionada.

En términos matemáticos más sofisticados y abstractos que usaré horriblemente e incorrectamente: tengo un gráfico no dirigido, donde cada vértice es un Autor o un Libro, y cada borde tiene un Autor para un vértice y un Libro para el otro. Eso suena un poco confuso, pero (creo) describe mi situación tan exactamente como puedo hacerlo.
Dada la descripción anterior, quiero saber si puedo adjuntar datos arbitrarios a un borde determinado de esa relación y recuperarlos más tarde.

Actualmente tengo un tercer modelo, AuthorBook, que actúa como borde del gráfico.
El autor tiene una relación de hasMany con AuthorBook.
El libro tiene una relación de hasMany con AuthorBook.
AuthorBook tiene una relación con el autor y el libro, y además tiene un campo de url.

Esta solución funciona, pero por alguna razón, el hecho de que el Libro no esté directamente conectado con el Autor me está molestando. ¿Hay alguna forma de lograr este mismo efecto y al mismo tiempo eliminar el modelo de AuthorBook de la imagen?

(Además, me doy cuenta de que puedo relacionarlos directamente mientras mantengo el AuthorBook, pero eso parece feo y también redundante).

(Además, me doy cuenta de que todavía tendría una tabla SQL autor_book. Esto no me molesta en lo más mínimo, creo que es imposible prescindir de todos modos).

¡Gracias por tu tiempo! ¡Y por favor no me llames!

¿Fue útil?

Solución

Sí, puede modelar la relación de libro de autor (o el 'borde' como lo imagina).

class Author extends AppModel {
    ...
    $hasAndBelongsToMany = array('Book', array('with' => 'AuthorBook'));
    ....
}

El " con " opción habtm:

  

Define el nombre del modelo para la tabla de unión. Por defecto, CakePHP creará automáticamente un modelo para ti. Usando el ejemplo anterior, se llamaría RecipesTag . Al utilizar esta clave, puede anular este nombre predeterminado. El modelo de tabla de unión se puede utilizar como cualquier " regular " modelo para acceder a la tabla de unión directamente.

Este es el equivalente de RoR's " a través de " ;, representado muy bien en esta ilustración

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