Laravel简化查询方法

z18hc3ub  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(143)

在Book模型中,我有两种方法
1个用于获取图书列表,另一个用于获取授权用户收藏夹图书列表。两种方法如下
获取图书列表:

public function getBooks($id = null)
{
    $query = $this::with("bookImages","author","category")->withCount(['favourites'])->orderBy('created_at', 'desc');
    return $id ? $query->findOrFail($id):$query;
}

用于获取用户收藏的图书列表

public function getFavList()
{
        return $this::join('favorites', function($query){
                $query->on('books.id','=','favorites.book_id')->where('favorites.user_id', '=', 1);
            })
            ->with("bookImages","author","category")->withCount(['favourites'])->orderBy('created_at', 'desc')
        ;
}

在这两个查询中,with是常见的。因此,我尝试在getFavList方法中重用getBooks方法,如下所示

public function getFavList()
{
        return $this::join('favorites', function($query){
                $query->on('books.id','=','favorites.book_id')->where('favorites.user_id', '=', 1);
            })
            ::$this->getBooks()
        ;
}

这里我得到了Access to undeclared static property Illuminate\Database\Eloquent\Builder::$this。我如何简化这个方法?

wgxvkvu9

wgxvkvu91#

它在官方文档中的“Eager Loading”下多重关系:

$books = Book::with('author', 'publisher')->get();

嵌套关系:

$books = Book::with('author.contacts')->get();

所以对你来说:

Advert::with('getBooks.getFavList')->find(1);

另一种方法-您甚至可以尝试联合方法:

public function getFavBooks()
{
    return $this->getBooks()->union($this->getFavList()->toBase());
}
4c8rllxm

4c8rllxm2#

简单的方法是:P

return $this->getBooks()->join('favorites',function($query){
    $query->on('books.id','=','favorites.book_id')->where('favorites.user_id', '=', 1);
});

相关问题