Syntax folder repository for the function edit()

a 夏天 提交于 2019-12-11 02:35:44

问题


I have 2 foreign keys which are fk_author and fk_bookcase , I am trying to create my function edit() via a folder Repositorie but I am stuck on the syntax again.

Here is my code via the file BookRepository

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

Then, in my Controller I have this...

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

Do you have an idea of the problem?

Regards


回答1:


If you want to retrieve the book with the related 'author' and 'bookcase', you must have defined the relations in the models. For ex:

Book Model

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');
}

Author Model

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

Bookcase Model

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

And you doesn't need and edit() function in your repository, just a detail() (or the name what you want) which retrive the Book Object with the relations.

BookRepository

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

Then, in the Controller, yes, you have an edit function which get the detail from the repository and return the object to the edit view.

/**
* @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'));
}

If in any case you want to also return all the authors and bookcases, I think it is better to make a repository for each one, so you can also use them from other Controllers or Classes.

AuthorRepository

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

BookcaseRepository

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

Then, in the Controller

/**
* @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'));
}


来源:https://stackoverflow.com/questions/56510662/syntax-folder-repository-for-the-function-edit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!