php - llaves - ¿Cómo recuperar datos completos de registro por su clave externa en laravel?
laravel tablas (5)
¿Qué tal si lo haces manualmente y construyes tu propia matriz?
$bookshelf = Bookshelf::find($id)->books;
$thebooks = array();
foreach($bookshelf as $val){
$book = Book::find($val->book_id);
$thebooks[] = $book;
}
Luego simplemente devuelva $thebooks
a la Vista. Que será una serie de modelos de libros.
He estado tratando de encontrar la manera correcta de obtener todos los datos de un registro a través de una clave externa. Tengo una aplicación sencilla donde los usuarios pueden agregar libros a su "estantería".
Aquí están mis tablas:
Los usuarios
ID | NAME |
LIBROS
ID | PAGES | NUMBER_OF_CHAPTERS
ESTANTE PARA LIBROS
ID | USER_ID (foreign key to `users.id`) |
LIBRO DE LIBROS
ID | BOOKSHELF_ID (foreign key to `bookshelf.id`) | BOOKS_ID (foreign key to `books.id`)
En mis modelos elocuentes, una bookshelf
muchos libros y bookshelf_books
pertenece a una bookshelf
y los he configurado en mis modelos.
Lo que sucede es que los usuarios crean una "estantería" y le agregan libros de la lista de libros.
Estoy en el punto en el que necesito renderizar la estantería con los libros del usuario.
Cuando recupero mis libros de estantería con una llamada como Bookshelf :: find ($ id) -> libros, los libros que pertenecen a esa estantería regresan bien ... pero solo columnas de la tabla de estantería. Así que obtengo a cambio el ID de estantería, el ID de usuario y el ID de libro.
Lo que quiero devolver son todos los datos del libro cuando busco libros en la estantería, no solo su id. EG [{"book_id":1, "pages":364, "number_of_chapters":14},{"book_id":2, "pages":211, "number_of_chapters":9}]
.
Me he estado rascando la cabeza todo el día tratando de descubrir cómo llevar esta "unión" un paso más allá en Laravel / Eloquent ORM.
Me encantaría cualquier ayuda con esto, gracias !!
Lo que tienes debe ser correcto.
$bookshelf = Bookshelf::find($id)->books;
Para obtener tus libros, crearías un bucle ...
@foreach($bookshelf->books as $book)
{{ $book->name }}
{{ $book->title }}
@endforeach
Para llevar esto más lejos, si tuviera un modelo de Autor al que belongTo()
sus libros belongTo()
, incluso podría hacer algo como ...
@foreach($bookshelf->books as $book)
{{ $book->name }}
{{ $book->title }}
{{ $book->author->name }}
@endforeach
Prueba esta consulta
SELECT b.id, b.pages, b.number_of_chapters
FROM bookshelf bs
JOIN bookshelf_books bsb ON bsb.bookshelf_id = bs.id
JOIN books b ON b.id = bsb.books_id
WHERE bs.id = "Id of bookshelf"
Solo ansioso cargar la relación.
Cambio
Bookshelf::find($id)->books
a
Bookshelf::with(''books'')->find($id)->books
SELECT *
FROM BOOKSHELF_BOOKS
JOIN BOOKSHELF ON BOOKSHELF_BOOKS.BOOKSHELF_ID = BOOKSHELF.ID
JOIN USERS.ID = BOOKSHELF.USER_ID
Intente esta declaración SQL, funcionará.