Объединение массивов в Laravel

#php #arrays #laravel #eloquent

#php #массивы #laravel #красноречивый

Вопрос:

Я новичок в Laravel и пытаюсь объединить или объединить массивы в один массив, который имеет отношение «один ко многим». Это модели:

 class GroupMenu extends Model
{
    public function optionmenu()
    {
        return $this->hasMany(OptionMenu::class, 'groupmenu_id');
    }
}
 
 class OptionMenu extends Model
{
    public function groupmenu()
    {
        return $this->belongsTo(GroupMenu::class, 'groupmenu_id');
    }
}
 

Также у меня есть эта функция, которая возвращает следующее расположение.

   public function getOptionMenus()
{
    $optionmenu = OptionMenu::whereHas('tipousuario', function ($query) {
        $query->where('tipousuario_id', session()->get('tipousuario_id'))->orderBy('orden');
    })->get()->toArray();

    return $optionmenu;
}
 

Вывод такой:

 array:17 [▼
  0 => array:2 [▼
    "id" => 1
    "groupmenu_id" => 1
  ]
  1 => array:2 [▼
    "id" => 2
    "groupmenu_id" => 1
  ]
  2 => array:2 [▼
    "id" => 3
    "groupmenu_id" => 1
  ]
  3 => array:2 [▼
    "id" => 4
    "groupmenu_id" => 2
  ]
  4 => array:2 [▼
    "id" => 5
    "groupmenu_id" => 2
  ]

 

Моя проблема в том, что я хочу иметь массив, в котором для каждого groupmenu есть массив optionmenu, что-то вроде этого:

   0 => array:2 [▼
    "id" => 1
    "optionmenu" => array:3[array of all the optionsmenu that belongs to the groupmenu]      

  ]
  1 => array:2 [▼
    "id" => 2
    "optionmenu" => array:1[array of all the optionsmenu that belongs to the groupmenu]  
  ]
 

Комментарии:

1. Используйте OptionMenu::with('GroupMenu') , а затем оператор where

2. Что такое tipousuario — другая связанная модель, для которой у вас есть идентификатор, сохраненный в сеансе?

3. Да! tipousuario — еще одна связанная модель

Ответ №1:

Если вы хотите получить все записи GroupMenu со связанными записями OptionMenu без каких-либо ограничений

 $data = GroupMenu::with('optionmenu')->get();
 

Однако, если вы хотите ограничить связанные записи OptionMenu для каждой родительской записи GroupMenu на основе идентификатора tipousuario -, который вы получаете из сеанса, как показано в вашем вопросе, тогда вы можете попробовать что-то вроде

 $data = GroupMenu::with([
  'optionmenu' => fn($query)  =>
    $query->whereHas('tipousuario', fn($q) =>
      $q->where('tipousuario_id', session()->get('tipousuario_id'))->orderBy('orden')
    )
  ])->get();
 

Комментарии:

1. Спасибо @Donkarnash, который решил мой вопрос!

2. @CesarArroyo Рад, что смог помочь. Пожалуйста, вы можете пометить ответ как принятый / одобренный в интересах последующих посетителей.