在Laravel中显示模型的多级类别

sigwle7e  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(158)

因此,我创建了一个名为“书籍”的模型。每本书都有一组作为嵌套类别的类型(使用模型Genre),因此一本书可能是小说〉成人〉科幻小说〉赛博朋克或非小说〉年轻人〉历史〉罗马等。
书籍和类型之间存在多对多的关系,并有一个数据透视表将两者联系起来。
Genre模型看起来是这样的:

class Genre extends Model
{
    use HasFactory;

    use HasRecursiveRelationships;

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

    public static function tree()
    {
        $allgenres = Genre::get();

        $rootgenres = $allgenres->whereNull('parent_id');

        self::formatTree($rootgenres, $allgenres);

        return $rootgenres;
    }

    private static function formatTree($genres, $allgenres)
    {
        foreach ($genres as $genre) {
            $genre->children = $allgenres->where('parent_id', $genre->id)->values();

            if ($genre->children->isNotEmpty()) {
                self::formatTree($genre->children, $allgenres);
            }
        }
    }

书的模型是这样的:

class Books extends Model
{
    use HasFactory;

    public function writer(): BelongsTo 
    {
        return $this->belongsTo(Writer::class);

    }

    public function genres()
    {
        return $this->belongsToMany(Genre::class);
    }
}

然后在book.blade.php中我写了以下内容:

<div>
        @foreach ($book->genres as $genre)
        <div>{{ $genre->name }}
            @foreach ($genre->children as $child)
            <div class="ml-5">{{ $child->name }}
                @foreach ($child->children as $child2)
                <div class="ml-5">{{ $child2->name }}
                    
                    @foreach ($child->children as $child3)
                    <div class="ml-5">{{ $child3->name }}</div>
                    @endforeach

                </div>
                @endforeach

            </div>
            @endforeach
        </div>
        @endforeach
    </div>

然后,它将模型中的每一个流派都转储出来,如下所示:

我想要的是它只显示这本书的选定类型,看起来我到目前为止只显示了特定书籍关系的最高层,但当它进入子层时,这种关系福尔斯了。

iszxjhcz

iszxjhcz1#

如果你只想得到4个级别的流派,试试:

$book = Books::where('id', $bookId)->with([
    'genres' => function ($query) {
        $query->whereNull('parent_id');
    },
    'genres.children' => function ($query) use ($bookId) {
        $query->wherePivot('book_id', $bookId);
    },
    'genres.children.children' => function ($query) use ($bookId) {
        $query->wherePivot('book_id', $bookId);
    },
    'genres.children.children.children' => function ($query) use ($bookId) {
        $query->wherePivot('book_id', $bookId);
    }
])->first();

相关问题