Как создать простой динамический выпадающий список в Laravel?

#php #database #laravel #laravel-5 #foreign-keys

#php #База данных #laravel #laravel-5 #внешние ключи

Вопрос:

Я новичок в Laravel и плохо разбираюсь в синтаксисе. Я видел много руководств и прочитал много ответов, но все же, мой разум не понял, как я могу иметь выпадающее поле для внешнего ключа.

У меня есть одна таблица «Section» и другой «Class». Я хочу показать название классов на странице раздела.

Миграция разделов

 Schema::create('sections', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->integer('class_id')->unsigned();
    $table->foreign('class_id')->references('id')->on('classses');
});
  

Миграция классов

 Schema::create('classses', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->timestamps();
});
  

Честно говоря, я не знаю, следовало ли мне менять свой контроллер или нет.

Лезвие / Просмотр

 <div class="form-group">
    <label for="name">Name</label>
    <input type="text" class="form-control" name="name" id="title">
</div>
<div class="form-group">
    <label for="cid">Class</label>
    ???????????????
</div>
  

Функция индекса

 public function index()
    {        $sections = Section::all();
            return view('sections.index', compact('sections'));

        $classs = Classs::all()->pluck(['id', 'title']);
        return view('sections.index')->with('classs', $classs); }
  

Ошибка — оператор Unreachable в строке $class amp; Ожидаемая строка, получен массив в ([id,’title])

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

1. Итак, вы хотите выпадающий список со всеми классами? Если да, пожалуйста, добавьте миграцию для вашей таблицы классов 🙂

2. Я обновил свой вопрос. Пожалуйста, проверьте это еще раз 🙂

3. Я отредактировал свой ответ, посмотрите, работает ли он.

Ответ №1:

В вашем контроллере у вас есть функция для возврата представления.

Измените его на include ->with() , чтобы вы могли получить доступ к классам в представлении:

 // if the controller is not for the classes, add this up top:
use AppClasss; // include model name



$classs = Classs:all();

return view('yourView')->with('classe', $classs);
  

Тогда, на ваш взгляд, вы можете просто сделать это:

 <div class="form-group">
  <label for="cid">Class</label>

  <select class="" name="cid">
    <option value="null">Class</option>
    @foreach($classs as $class)
      <option value="{{$class->id}}">{{$class->title}}</option>
    @endforeach
  </select>

</div>
  

Он перебирает все классы в вашей базе данных и создает <option> элемент для них. Глядя на вашу первую миграцию, вы используете идентификатор в другой таблице, поэтому вам нужно установить его в качестве значения.


Измените свою функцию индекса на это:

 public function index()
{
    $sections = Section::all();
    $classs = Class::all();

    return view('sections.index')->with('sections', $sections)->with('classs', $classs);
}
  

Не могли бы вы сказать мне, где я могу написать условия, такие как select * from class где role_id=2 и т.д.

По сути, в среде MVC вы выполняете все свои запросы в своем контроллере и передаете данные в представление, в котором вы отображаете данные.

В Laravel есть класс DB, который вы можете использовать для базовых запросов:

 select * from class where role_id = 2
  

Стало бы это в Laravel, используя класс DB.

 DB::table('class')->where('role_id', 2)->get();

// or if it's a model:
Model::where('role_id', 2)->get();
  

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

1. Я пишу верхний код в функции Index, но он выдает ошибку из-за того, что в нем уже есть код одного раздела. Где я должен написать этот код?

2. Добавьте свою индексную функцию и сообщение об ошибке в сообщение.

3. ‘ public function index()’ { $sections = Section::all(); return view(‘разделы.индекс’, compact(‘разделы’)); $classs = Classs::all()-> pluck([‘id’, ‘title’]); return view(‘разделы.индекс’)->with(‘classs’, $classs); }’

4. Не могли бы вы добавить это в сообщение, чтобы его было немного легче читать.

5. Это работает, но не могли бы вы сказать мне, где я могу написать условия, такие как select * from class где role_id=2 и т.д.

Ответ №2:

Теперь я использовал этот код на странице блейда

               @php
                use IlluminateSupportFacadesDB;
                $cid=DB::table('classses')->get();
                $uid=DB::table('users')->where('role_id','3')->get();
                $counter=0;
                @endphp

                <select class="" name="class_id">
                    <option value="null">Class</option>
                    @foreach($cid as $class)
                        @if($counter==0)
                        <option selected="selected" value="{{$class->id}}">{{$class->title}}</option>
                        {{$counter  }}
                    @else

                        <option value="{{$class->id}}">{{$class->title}}</option>
                    @endif
                            @endforeach
                </select>