【问题标题】:Laravel 5: How to get all adverts from a category including all subcategoriesLaravel 5:如何从包括所有子类别的类别中获取所有广告
【发布时间】:2017-10-03 13:09:39
【问题描述】:

我有以下模型和关系

class Advert extends Model
{
    public function category() {
        return $this->belongsTo('App\Category');
    }
}

class Category extends Model
{

    public function parent() {
        return $this->belongsTo('App\Category', 'category_id','id');
    }

    public function children() {
        return $this->hasMany('App\Category', 'category_id');
    }

    public function adverts() {
        return $this->hasMany('App\Advert');
    }
}

我有属于某个类别的广告的表格...广告的类别可以是另一个类别的子类别...子类别级别最大为 4。如何通过主根类别从所有子类别中检索所有广告它属于。

例如

<ul>
<li>Smartphones
  <ul>
      <li>Android
          <ul>
              <li>Samsung</li>
              <li>Huawei</li>
              <li>LG</li>
              <li>Meizu</li>
              <li>Acer</li>
          </ul>
      </li>
      <li>Apple
          <ul>
              <li>iPhone 5</li>
              <li>iPhone 6</li>
              <li>iPhone X</li>
          </ul>
      </li>
  </ul>
</li>
</ul>

我如何从所有子类别中获取所有广告,例如,如果我点击智能手机...我必须遍历每个级别还是有一个更简单的关系解决方案...

谢谢

【问题讨论】:

  • 创建一个递归函数,将当前类别作为参数。在这个函数中,检查这个类别是否有任何孩子。回显孩子,并检查他们是否有孩子,如果有,请从函数的循环中调用您刚刚为这些孩子创建的函数
  • 这看起来很相似:stackoverflow.com/a/38216669/1744771
  • @JamesSheils 这有点帮助我,但它没有从最后一级类别中获取广告......

标签: php laravel fetch categories relation


【解决方案1】:

你可以让关系递归

class Advert extends Model
{
    public function category() {
        return $this->belongsTo('App\Category');
    }
}

class Category extends Model
{

    public function parent() {
        return $this->belongsTo('App\Category', 'category_id','id');
    }

    public function parentRecursive()
    {
        return $this->parent()->with('parentRecursive');
    }



    public function children() {
        return $this->hasMany('App\Category', 'category_id');
    }

    public function childrenRecursive()
    {
        return $this->children()->with('childrenRecursive');

    }

    public function adverts() {
        return $this->hasMany('App\Advert');
    }
}

用于获取具有递归结果的广告

$adverts = Advert::with('Category')
    ->with('Category.childrenRecursive')->whereNull('Category.parent')->get();

【讨论】:

    【解决方案2】:

    尝试使用nested sets 包。它很棒,而且很容易完成这项工作。

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多