Синтаксическая папка-хранилище для функции edit () - PullRequest
2 голосов
/ 09 июня 2019

У меня есть 2 внешних ключа fk_author и fk_bookcase, я пытаюсь создать свою функцию edit () через папку Repositorie, но я снова застрял в синтаксисе.

Вот мой код через файл BookRepository

public function edit($id)
{
    $books = Book::find($id);
    $authors = Author::all();
    $bookcases = Bookcase::all();
    return Book::find($id);     
}

Затем в моем контроллере у меня есть это ...

public function edit($id)
{
  $books = $this->books->edit($id);
  return view('admin.books.edit', compact('books', 'authors', 'bookcases'));
}

У вас есть идея?проблемы?

С уважением

1 Ответ

3 голосов
/ 09 июня 2019

Если вы хотите получить книгу с соответствующими «автором» и «книжным шкафом», вы должны были определить отношения в моделях. Например:

Книга Модель

public function author()
{
    return $this->belongsTo(Author::class, 'fk_author'); // change fk_author for the key you are using
}

public function bookcase()
{
    return $this->belongsTo(Bookcase::class, 'fk_bookcase');
}

Автор Модель

public function books()
{
    return $this->hasMany(Book::class);
}

Книжный шкаф Модель

public function books()
{
    return $this->hasMany(Book::class);
}

И вам не нужна функция edit() в вашем хранилище, просто detail() (или имя, которое вы хотите), которые возвращают объект Book с отношениями.

BookRepository

public function detail($id)
{
    return Book::with([
            'author',
            'bookcase',
        ])
        ->find($id);     
}

Затем в Controller , да, у вас есть функция редактирования, которая получает детали из хранилища и возвращает объект в представление редактирования.

/**
* @var BookRepository
*/
private $books;

public function __construct(BookRepository $books)
{
    $this->books = $books;
}

public function edit($id)
{
  $book = $this->books->detail($id);
  return view('admin.books.edit', compact('book'));
}

Если в любом случае вы захотите также вернуть всех авторов и книжные шкафы, я думаю, что лучше создать репозиторий для каждого, так что вы также можете использовать их из других контроллеров или классов.

AuthorRepository

public function getAll()
{
    return Author::all();    
}

BookcaseRepository

public function getAll()
{
    return Bookcase::all();   
}

Затем в Контроллере

/**
* @var BookRepository
*/
private $books;
/**
* @var AuthorRepository
*/
private $authors;
/**
* @var BookcaseRepository
*/
private $bookcases;

public function __construct(BookRepository $books, AuthorRepository $authors, BookcaseRepository $bookcases)
{
    $this->books = $books;
    $this->authors = $authors;
    $this->bookscases = $bookcases;
}

public function edit($id)
{
    $book = $this->books->detail($id);
    $authors = $this->authors->getAll();
    $bookcases = $this->bookcases->getAll();
    return view('admin.books.edit', compact('book', 'authors', 'bookcases'));
}
...