2017-01-01 2 views
2

Как вернуть все идентификаторы AllSubSections (все уровни)Laravel вернуть все идентификаторы потомков

class Section extends Model 
{ 
    public function Ads() 
    { 
     return $this->hasMany(Ad::class); 
    } 

    public function AllSubSections() 
    { 
     return $this->SubSections()->with('AllSubSections'); 
    } 

    public function SubSections() 
    { 
     return $this->hasMany(Section::class); 
    } 

    public function Parent() 
    { 
     return $this->belongsTo(Section::class); 
    } 
} 

, что я в настоящее время делают это:

$section = Section::where('name', 'Properties')->first(); 
$subSections = $section->AllSubSections; 
$subSections->pluck('id') 

но он возвращает только 1-го уровня не все уровни.

+1

'$ section = Section :: where ('name', 'Properties') -> get() -> first();' Почему? '$ section = Section :: where ('name', 'Properties') -> first();' Используйте это вместо –

+0

@RajenderJoshi, я тестировал, отсутствовал с ним и забыл изменить его. – Abanoub

ответ

0

Вот что я пришел с:

use Illuminate\Support\Collection; 

class Section 
{ 
    public function children() 
    { 
     return $this->hasMany(Section::class,); 
    } 

    public function parent() 
    { 
     return $this->belongsTo(Section::class); 
    } 

    public function getAllChildren() 
    { 
     $sections = new Collection(); 

     foreach ($this->children as $section) { 
      $sections->push($section); 
      $sections = $sections->merge($section->getAllChildren()); 
     } 

     return $sections; 
    } 
} 

Как вы можете видеть, getAllChildren рекурсивная функция. Он содержит цикл над дочерними элементами раздела, который добавляет в коллекцию текущий дочерний элемент и снова вызывает себя на этом дочернем элементе.

Вы можете использовать:

$section->getAllChildren()->pluck('id'); 

И вы получите все ваши ребенок идентификаторов.

Надеюсь, я отвечу на вопрос!

Смежные вопросы