#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>