как написать этот запрос в Laravel - PullRequest
0 голосов
/ 15 октября 2018

У меня есть две таблицы

1. menu

id      -     menu_name    -     menu_url
1       -     Home         -      index
2       -     About        -      about
3       -     Services     -            
4       -     Contact      -      contact

2. submenu 

id      -     menu_name    -     submenu_name  
1       -     Services     -      Web Development
2       -     Services     -      Web Designing
3       -     Services     -      Logo Designing      
4       -     Services     -      SEO

, для которых я создал этот запрос в php

$query = mysqli_query($con,"SELECT * FROM menu");
while ($row = mysqli_fetch_assoc($query)){
      if ($row['menu_url'] == ''){
        $subquery = mysqli_query($con,"SELECT * FROM submenu WHERE 
        menu_name = '".$row['menu_name']."'");
          while ($row1 = mysqli_fetch_assoc($subquery)){
            //do something here
           }
        }else{
           //do something here
        }
}

Мой вопрос заключается в том, как мне выполнить этот запрос в laravel?

мой запрос контроллера

$menu = menu::all();

$submenu = submenu::where('menu_name','i want the $menu->menu_name variable here')->get();

как получить эту переменную во втором запросе.

Заранее благодарен за любую помощь.

Ответы [ 5 ]

0 голосов
/ 15 октября 2018

Ваш первый запрос (и цикл) не нужны:

SELECT x.* 
  FROM submenu x
  JOIN menu y
    ON y.menu_name = x.menu_name;

Я оставлю бит ларавеллы в качестве упражнения для читателя

Кроме того, как уже упоминалось, вы должныиспользуйте PK таблицы меню в качестве FK таблицы подменю.

0 голосов
/ 15 октября 2018

Я думаю, что было бы лучше, если бы вы создали отношения один-ко-многим между Menu и Submenu моделями, для этого было бы лучше, если вы предоставите внешний ключ menu_id в таблице sumbenu;

Таким образом, у вас будет две таблицы со следующими столбцами:

menu{id(primary_key), menu_name, menu_url(better to provide slug not url)};
sumenu{id(primary_key), menu_id(foreign_key pointing to menu tables id), sumbenu_name, submenu_url(better to provide slug not url)}

После того, как вы сможете определить отношения в каждой модели

Модель меню:

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

SubMenu Model:

public function menu()
    {
        return $this->belongsTo('App\Menu');
    }

после всего, что вы можете сделать $menuitems = Menu::all(), затем передать переменную $ menus в представление внешнего интерфейса, и в интерфейсе вы можете написать

@foreach($menuitems as $menuitem)
{{ menuitem }}
    @foreach($menuitem->submenus as $submenu )
       {{ submenu }}
    @endforeach
@endforeach

Вот и все:)

0 голосов
/ 15 октября 2018

Более эффективный способ:

$all_sub_menu = Submenu::get();

$all_sub_menu = collect($all_sub_menu)->groupBy('menu_name');

foreach( $menu as $m )  // To get the individual records
{

    if(isset($all_sub_menu[$m->menu_name]){
        $sub_menu = $all_sub_menu[$m->menu_name]; 
        // you will get submenu for the current menu without requesting the database again and again
    }
    else{
        $sub_menu = array();
    }
}
0 голосов
/ 15 октября 2018

Попробуйте следующие коды:

номер 1:

$menu=menu::all();

$menu->each(
    function($eachMenu)
    {
        $submenu[] = submenu::where('menu_name', $eachMenu->menu_name)->get();
    }
)

номер 2:

$menu=menu::all();

foreach($menu as $eachMenu) {
    $submenu[] = submenu::where('menu_name', $eachMenu->menu_name)->get();
}
0 голосов
/ 15 октября 2018

Попробуйте:

$menu=menu::all();

if( count( $menu ) > 0 )  // Iterate only when there is some data available
{
    foreach( $menu as $m )  // To get the individual records
    {
        $submenu=submenu::where('menu_name', $m->menu_name)->get();

        // here $submenu is an Std Class object, so use foreach() in the same way as above
    }
}

PS: Запросы внутри цикла не очень хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...