【问题标题】:Laravel 6 eloquent relationships on multicategoriesLaravel 6 雄辩的多类别关系
【发布时间】:2020-07-01 03:55:53
【问题描述】:

我创建了 3 个数据库模型。一个是父类别,另一个是子类别,第三个是属于这些类别的帖子。

层次结构如下:

Parent
--Subcategory
----Post1
----Post2
----etc

我在模型上创建了以下关系:

子类别模型:

public function getCategoryDetails() 
{
    return $this->hasOne('App\Models\Categories' , 'id' ,'catId');
}

public function getPosts() 
{
    return $this->hasMany('App\Models\Posts' , 'catId' ,'id');
}

帖子模型:

public function getSubcategoryDetails() 
{
    return $this->hasOne('App\Models\Subcategories' , 'id' ,'catId');
}

这是视图内的代码:

    <div class="card mt-2">
    <h5 class="card-header bg-dark text-white d-flex align-items-center">Tillgänliga Kurser från denna arrangör</h5>
        <div class="card-body"> 
        @foreach($posts as $post)
        <div class="card-title">
        {{ $post->getSubcategoryDetails->getCategoryDetails->name }}
        </div>
        <div class="card-title">
        {{ $post->getSubcategoryDetails->name }}
        </div>
        <a href="/kategorier/{{ $post->getSubcategoryDetails->getCategoryDetails->slug }}/kurser/{{ $post->getSubcategoryDetails->slug }}/annons/{{ $post->slug }}">{{ $post->name }}</a>
        <br>
        @endforeach            
        </div>
            <!-- //Project Description Section End -->
    </div>  

现在这段代码几乎完全符合我的要求:它显示每个帖子的类别,然后为每个帖子创建一个有效链接。

但是,上面的代码在每次迭代时都会重复类别,这是不希望的。我希望它只显示每个类别一次及其下方的结果。预期结果示例:

Parent Category 1
--Subcategory 1
----Post1
----Post2
Parent Category 2
--Subcategory 1
----Post1
--Subcategory 2
----Post1

但我的代码将始终在每次迭代的每个帖子上方显示类别和子类别,即使帖子属于相同的类别/子类别组合。它现在如何工作的示例:

Parent Category 1
--Subcategory 1
----Post1
Parent Category 1
--Subcategory 1
----Post2
Parent Category 2
--Subcategory 1
----Post1
Parent Category 2
--Subcategory 2
----Post1

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    您可以在Collection 上使用mapgroupBy 来实现(Laravel 查询返回集合)。

    $posts->map(function($post, $key) {
        $post['category'] = [
            'name' => $post->getSubcategoryDetails->getCategoryDetails->name,
            'slug' => $post->getSubcategoryDetails->getCategoryDetails->slug,
        ];
        $post['subcategory'] = [
            'name' => $post->getSubcategoryDetails->name,
            'slug' => $post->getSubcategoryDetails->slug,
        ];
    
        return $post;
    })->groupBy(['category.slug', 'subcategory.slug']);
    

    小例子

    假设你的 Post 集合是这样的。

    $posts = collect([
        [
            'title' => 'post title 1',
            'slug' => 'post-title-1',
            'category_id' => 1,
            'subcategory' => 1,
        ],
        [
            'title' => 'post title 2',
            'slug' => 'post-title-2',
            'category' => 2,
            'subcategory' => 2,
        ],
        [
            'title' => 'post title 3',
            'slug' => 'post-title-3',
            'category' => 1,
            'subcategory' => 3,
        ],
        [
            'title' => 'post title 4',
            'slug' => 'post-title-4',
            'category' => 2,
            'subcategory' => 4,
        ],
    ]);
    

    使用map 检索每个帖子类别子类别Post 集合会这样修改。

    $posts = collect([
        [
            'title' => 'post title 1',
            'slug' => 'post-title-1',
            'category_id' => 1,
            'subcategory' => 1,
            'category' => [
                'name' => 'category 1',
                'slug' => 'category-1',
            ],
            'subcategory' => [
                'name' => 'subcategory 1',
                'slug' => 'subcategory-1',
            ],
        ],
        [
            'title' => 'post title 2',
            'slug' => 'post-title-2',
            'category' => 2,
            'subcategory' => 2,
            'category' => [
                'name' => 'category 2',
                'slug' => 'category-2',
            ],
            'subcategory' => [
                'name' => 'subcategory 2',
                'slug' => 'subcategory-2',
            ],
        ],
        [
            'title' => 'post title 3',
            'slug' => 'post-title-3',
            'category' => 1,
            'subcategory' => 3,
            'category' => [
                'name' => 'category 1',
                'slug' => 'category-1',
            ],
            'subcategory' => [
                'name' => 'subcategory 3',
                'slug' => 'subcategory-3',
            ],
        ],
        [
            'title' => 'post title 4',
            'slug' => 'post-title-4',
            'category' => 2,
            'subcategory' => 4,
            'category' => [
                'name' => 'category 2',
                'slug' => 'category-2',
            ],
            'subcategory' => [
                'name' => 'subcategory 4',
                'slug' => 'subcategory-4',
            ],
        ],
    ]);
    

    发布收集的结果上使用groupBy

    $posts->groupBy(['category.slug', 'subcategory.slug']);
    

    在 Tinker (php artisan tinker) 上运行后的输出。

    Illuminate\Support\Collection {#3718
      all: [
        "category-1" => Illuminate\Support\Collection {#3816
          all: [
            "subcategory-1" => Illuminate\Support\Collection {#3817
              all: [
                [
                  "title" => "post title 1",
                  "slug" => "post-title-1",
                  "category" => [
                    "name" => "category 1",
                    "slug" => "category-1",
                  ],
                  "subcategory" => [
                    "name" => "subcategory 1",
                    "slug" => "subcategory-1",
                  ],
                ],
              ],
            },
            "subcategory-3" => Illuminate\Support\Collection {#3814
              all: [
                [
                  "title" => "post title 3",
                  "slug" => "post-title-3",
                  "category" => [
                    "name" => "category 1",
                    "slug" => "category-1",
                  ],
                  "subcategory" => [
                    "name" => "subcategory 3",
                    "slug" => "subcategory-3",
                  ],
                ],
              ],
            },
          ],
        },
        "category-2" => Illuminate\Support\Collection {#3706
          all: [
            "subcategory-2" => Illuminate\Support\Collection {#3736
              all: [
                [
                  "title" => "post title 2",
                  "slug" => "post-title-2",
                  "category" => [
                    "name" => "category 2",
                    "slug" => "category-2",
                  ],
                  "subcategory" => [
                    "name" => "subcategory 2",
                    "slug" => "subcategory-2",
                  ],
                ],
              ],
            },
            "subcategory-4" => Illuminate\Support\Collection {#3721
              all: [
                [
                  "title" => "post title 4",
                  "slug" => "post-title-4",
                  "category" => [
                    "name" => "category 2",
                    "slug" => "category-2",
                  ],
                  "subcategory" => [
                    "name" => "subcategory 4",
                    "slug" => "subcategory-4",
                  ],
                ],
              ],
            },
          ],
        },
      ],
    }
    

    【讨论】:

    • 问题是帖子集合没有分类和子分类。我需要通过运行关系来检索它们,即 $post->getSubcategoryDe​​tails->getCategoryDe​​tails->name。帖子集合只有子类别的id,然后子类别有主类别的id。
    • 你可以在集合上使用map来获取帖子集合中的categorysubcategory,然后在其上使用groupBy。我也会更新答案。
    【解决方案2】:

    嗯,这就是我最后所做的:

    帖子模型:

    public function Subcategory() 
    {
        return $this->belongsTo('App\Models\Subcategories' , 'id' ,'catId');
    }
    
    public function getSubcategoryDetails() 
    {
        return $this->hasOne('App\Models\Subcategories' , 'id' ,'catId');
    }
    

    子类别模型:

    public function getCategoryDetails() 
    {
        return $this->hasOne('App\Models\Categories' , 'id' ,'catId');
    }
    
    public function getPosts() 
    {
        return $this->hasMany('App\Models\Posts' , 'catId' ,'id');
    }
    

    控制器:

    $organizerDetails   = Organizers::where('slug', $slug)->first();
    $posts              = Subcategories::with('getCategoryDetails')->with('getPosts')->whereHas('getPosts', function($q) use ($organizerDetails) {
                        $q->where('organizerId', $organizerDetails->id);
                        })->get()->groupBy('getCategoryDetails.name');
    

    查看:

        <div class="card mt-2">
        <h5 class="card-header bg-dark text-white d-flex align-items-center">Tillgänliga Kurser från denna arrangör</h5>
            <div class="card-body">      
            @foreach($posts as $post => $details)           
                {{ $post }}
                <br>
                @foreach ($details as $singlePost)                        
                {{ $singlePost->name }}
                    <br>
                    @foreach ($singlePost->getPosts as $course)          
                    <a href="/kategorier/{{ $singlePost->getCategoryDetails->slug }}/kurser/{{ $course->getSubcategoryDetails->slug }}/annons/{{ $course->slug }}">{{ $course->name }}</a>
                    <br>
                    @endforeach
                @endforeach
            @endforeach        
            </div>
                <!-- //Project Description Section End -->
        </div> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 2012-10-08
      • 2016-11-26
      • 2015-03-14
      • 2018-11-28
      • 2015-01-11
      相关资源
      最近更新 更多