2013-07-26 2 views
16

Próbowałem znaleźć właściwy sposób na uzyskanie wszystkich danych z rekordu za pomocą klucza obcego. Mam prostą aplikację, w której użytkownicy mogą dodawać książki do "półki z książkami".Jak odzyskać pełne dane rekordu przez jego klucz obcy w laravel?

Oto moje tabele:

UŻYTKOWNICY

ID | NAME | 

KSIĄŻKI

ID | PAGES | NUMBER_OF_CHAPTERS 

schowka

ID | USER_ID (foreign key to `users.id`) | 

BOOKSHELF_BOOKS

ID | BOOKSHELF_ID (foreign key to `bookshelf.id`) | BOOKS_ID (foreign key to `books.id`) 

W moich wymowny Models, a bookshelf Książki hasMany i bookshelf_books belongsTo w bookshelf i mam ustawić te w moich modelach.

Co się dzieje, to użytkownicy tworzą "półkę z książkami" i dodają do niej książki z listy książek.

Jestem w punkcie, w którym muszę renderować półkę z książkami użytkownika.

Kiedy odzyskuję moje książki półki z wezwaniem takim jak Półka na książki :: znajdź ($ id) -> książki, książki, które należą do tej półki, wracają, dobrze ... ale tylko kolumny ze stołu na półce. Dostaję więc w zamian identyfikator półki z książkami, identyfikator użytkownika i identyfikator książki.

Chciałbym zwrócić wszystkie dane z samej książki, gdy pytam o książki na półce, a nie tylko o jej id. NA PRZYKŁAD. [{"book_id":1, "pages":364, "number_of_chapters":14},{"book_id":2, "pages":211, "number_of_chapters":9}].

Przez cały dzień drapałem się w głowę, próbując dowiedzieć się, jak zrobić to "dołączenie" o krok dalej w Laravel/Eloquent ORM.

Chciałbym pomóc w tej sprawie, dzięki!

+1

To powinno działać: 'DB :: tabeli ('książek') -> wybierz ('BOOKS.ID', 'BOOKS.PAGES', 'BOOKS.NUMBER_OF_CHAPTERS') -> join ('BOOKSHELF_BOOKS', 'BOOKS.ID', '=', 'BOOKSHELF_BOOKS.BOOKS_ID') -> join ('bookshelf', 'BOOKSHELF_BOOKS.BOOKSHELF_ID', '=', 'BOOKSHELF.ID') -> where ('bookshelf.user_id ',' = ', $ id_user) -> get(); ' –

+0

tak to działało, dobra robota Albert. Nie mogę pomóc, ale myślę, że musi to być czystszy sposób, aby zrobić to z ORM laravel, być może myślenie życzeniowe – user2551866

+0

Nie mogę tego wypróbować, ale: '$ books = Book :: join ('BOOKSHELF_BOOKS', 'BOOKS.ID ',' = ',' BOOKSHELF_BOOKS.BOOKS_ID ') -> join (.... // reszta złączeń ' –

Odpowiedz

0

Spróbuj tego zapytania

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" 
2

Co masz powinny być poprawne.

$bookshelf = Bookshelf::find($id)->books;

zdobycia książki, by utworzyć pętlę ...

@foreach($bookshelf->books as $book) 
    {{ $book->name }} 
    {{ $book->title }} 
@endforeach 

Aby wziąć to dalej, jeśli miał autor modelu, który byłby belongTo() Twoje książki, można nawet zrobić coś jak..

@foreach($bookshelf->books as $book) 
    {{ $book->name }} 
    {{ $book->title }} 
    {{ $book->author->name }} 
@endforeach 
-1
SELECT * 
FROM BOOKSHELF_BOOKS 
JOIN BOOKSHELF ON BOOKSHELF_BOOKS.BOOKSHELF_ID = BOOKSHELF.ID 
JOIN USERS.ID = BOOKSHELF.USER_ID 

Spróbuj SQL, to będzie działać.

2

Co zrobić po prostu ręcznie, i budować własną tablicę.

$bookshelf = Bookshelf::find($id)->books; 
    $thebooks = array(); 

    foreach($bookshelf as $val){ 
    $book = Book::find($val->book_id); 
    $thebooks[] = $book; 
    } 

Następnie po prostu zwróć $thebooks do widoku. Która będzie tablicą modeli książek.