Я хотел бы прочитать содержимое промежуточной таблицы между таблицами тренеров и курсов, чтобы иметь возможность пометить флажки активных курсов для данного тренера, как я могу это сделать?
Здесь вы можете посмотреть таблицу тренеров http://prntscr.com/nhcrl4
Здесь вы можете посмотреть таблицу курсов http://prntscr.com/nhcrvp
Здесь вы можете посмотреть таблицу course_trainer (промежуточную) http://prntscr.com/nhcsek
Я думал об использовании троичного, вы мне посоветуете?
большое спасибо
это форма
<div class="container">
<div class="row">
<div class="col-lg-12">
<form class="form-group" action="{{route('trainers.update', $trainer->id)}}" method="post" enctype="multipart/form-data">
@csrf
@method('PUT')
<div class="form-group">
<label for="name">Nome</label>
<input type="text" class="form-control" name="name" value="{{$trainer->name}}">
</div>
<div class="form-group">
<label for="surname">Cognome</label>
<input type="text" class="form-control" name="surname" value="{{$trainer->surname}}">
</div>
<div class="form-group">
<label for="description">Descrizione</label>
<textarea class="form-control" name="description" rows="8" cols="80">{!! $trainer->description !!}</textarea>
</div>
@foreach ($courses as $course)
<div class="form-check form-check-inline mb-2">
<input name="course_id[]" class="form-check-input" type="checkbox" value="{{$course->id}}">
<label class="form-check-label" for="course_id">{{$course->name_course}}</label>
</div>
@endforeach
<div class="form-group">
<img src="{{asset('storage/'.$trainer->image)}}" alt="">
</div>
<div class="custom-file">
<input type="file" class="custom-file-input" name="image">
<label class="custom-file-label" for="image">Scegli un'immagine</label>
<div class="invalid-feedback"><strong>N.B.</strong> dimensione consigliata 160px x 160px</div>
</div>
<div class="form-group">
<input type="submit" class="form-control" value="MODIFICA ISTRUTTORE">
</div>
</form>
</div>
</div>
</div>
это функция редактирования в контроллере
public function edit($id)
{
$trainer = Trainer::find($id);
$courses = Course::all();
return view('trainers.edit', compact('trainer','courses'));
}
это функция обновления в контроллере
public function update(Request $request, Trainer $trainer)
{
$data = $request->all();
$trainer->update($data);
$trainer->courses()->sync($data['course_id']);
return redirect()->route('trainers.admin');
}
Я решил проблему без изменения модели... этого было достаточно
@foreach ($courses as $course)
<div class="form-check form-check-inline mb-2">
<input name="course_id[]" class="form-check-input" type="checkbox" value="{{$course->id}}" @foreach ($trainer->courses as $value)
{{($course->id == $value->pivot->course_id) ? 'checked' : ''}}
@endforeach>
<label class="form-check-label" for="course_id">{{$course->name_course}}</label>
</div>
@endforeach
Это модель тренера
public function courses(){
return $this->belongsToMany('App\Course', 'course_trainer ', 'trainer_id', 'course_id')->withTimestamps();
}
Это модель курса
public function trainers(){
return $this->belongsToMany('App\Trainer', 'course_trainer ', 'course_id', 'trainer_id')->withTimestamps();
}
belongsToMany()
метода belongsToMany()
4, первый - это местоположение вашей модели для связи, второй - имя сводной таблицы, третий - внешний ключ текущей модели, а четвертый - внешний ключ другой модели.
Теперь вы можете сделать что-то подобное в виде
<input name="course_id[]" class="form-check-input" type="checkbox" @if($course->pivot->trainer_id == $trainer->id) "checked='' " @endif value="{{$course->id}}">
Это модель тренера
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Trainer extends Model
{
protected $fillable = ['name','surname','description','image'];
public function courses(){
return $this->belongsToMany(Course::class)->withTimestamps();
}
}
Это модель курса
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Course extends Model
{
protected $fillable = ['name_course','description_course','logo_course'];
public function trainers(){
return $this->belongsToMany(Trainer::class)->withTimestamps();
}
}
спасибо за ответ, но, по моему мнению, вы не читали мой код и не видели мои скриншоты, но самое главное, вы не поняли мой вопрос
все, что вы мне говорите, уже сделано, включая чтение документации, вставку, обновление и удаление данных с помощью отчетов, и мой вопрос был не в том, что
возможно, вместо того, чтобы повторяться снова и снова, чтобы прочитать документацию, которую вы могли бы попросить дать разъяснения по моему вопросу
Если вы ознакомились с документацией Laravel, вы можете увидеть
Таблица role_user основана на алфавитном порядке названий связанных моделей и содержит столбцы user_id и role_id.
Миграция этой таблицы будет выглядеть
Schema::create('role_user', function (Blueprint $table) {
$table->integer('user_id')->unsigned();
$table->integer('role_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')
->onUpdate('cascade')->onDelete('cascade');
$table->foreign('role_id')->references('id')->on('roles')
->onUpdate('cascade')->onDelete('cascade');
$table->primary(['user_id', 'role_id']);
});
В вашем случае дело обстоит иначе: вы пытались создать отдельную таблицу моделей, в которой будут храниться взаимосвязи ваших trainers
и таблицы courses
, поэтому теперь, если вы хотите обновить ее, вы можете обновить ее следующим образом.
рассматривая TrainerCourse другую модель, она будет похожа
$trainerCourse = App\TrainerCourse::where('trainer_id', '**')->where('course_id', '**')->first();
$trainerCourse->course_id = $data['course_id'];
$trainerCourse->save();
Я хотел бы предложить вам следовать документации laravel и изменить структуру таблицы, чтобы вы могли использовать такие сводные методы, как attach
, detach
и sync
.