BeginnerEngineerBlog
中の人
中の人

【再帰関数 php laravel eloquent】苦手なのでメモ

公開: 2024-11-04 19:45
更新: 2024-11-04 19:45
19
再帰関数 php eloquent laravel mysql
苦手なのでやりたくないけど、でも必要な時が来てしまう

こんにちは!

中の人です!

私は再帰関数非常に苦手です!

ということで、カテゴリーテーブルからparent_idを利用して全ての小孫カテゴリーを取得する関数をメモとして紹介します!

テーブル構造



parent_idが親カテゴリidのおそらくよくあるカテゴリツリーのテーブル構造です(だと思う)
↑上記参考リンクの通りアンチパターンみたいですが、代替方法もデメリットがあるみたいで、何を選択するかはその時の仕様とかによるかも

↑ mysqlですがsql文でやれそうですが、自分はsql苦手なのでsqlのみで実装したい方はやってみてください


再帰関数


    private function recursion(Category $category, ?Collection $collection = null)
    {
        $collection = !$collection
            ? new Collection()
            : $collection;
        $collection->push($category);
        $children = $category->children;


        foreach ($children as $child) {
            $collection = $this->recursion($child, $collection);
        }
        return $collection;
    }

使い方


    public function allChildren(Request $request)
    {
        $category = Category::query()
            ->find($request->get('category_id'));
        if (!$category instanceof Category) {
            abort(404);
        }
                             // ↓↑ 上の関数
        $categories = $this->recursion($category);
        return view(
            'category.index',
            [
                'parentCategory' => $category,
                'categories' => $categories,
            ]
        );
    }

view


@extends('layouts.app')
@section('content')
    カテゴリー一覧
    <div>
        parent: {{isset($parentCategory) ? $parentCategory->name : null}} id: {{$parentCategory->id}}
    </div>
    <a href="{{route('category.new', ['parent_id' => isset($parentCategory) ? $parentCategory->id : null])}}">新規登録</a>
    <div>
        @foreach ($categories as $category)
            <div style="display: flex;">
                <a href="{{route('category', ['category_id' => $category->id])}}">{{$category->name}}</a>
                id: {{$category->id}} parent_id: {{$category->parent_id}}
                <a href="{{route('category.all_child', ['category_id' => $category->id])}}">
                    全ての小孫を取得
                </a>
            </div>
        @endforeach
    </div>
@endsection

結果


テストカテゴリー1の全ての小孫



テストカテゴリー2の全ての小孫



多分大丈夫


終わりに


機会があれば途中で紹介した参考リンクの内容試してみようかな
0
0
0
0
通信エラーが発生しました。
【広告】
似たような記事