Laravel 7 多对多关系无效
Laravel 7 Relationship many to many not working
一个事件可以是一年到几年,一年可以有多个事件,所以要用到多对多的关系。
所以我有 3 个 table:evenements
、years
和 evenement_year
(枢轴 table)。
我仔细阅读了 Laravel 7 文档并认为我遵循了以下步骤:
晚会模特:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Evenement extends Model
{
protected $fillable = ['name', 'year_id','mnemonique','color'];
//One yar can have severals events and I give the name events_years to pivot
public function years()
{
return $this->belongsToMany(Year::class, 'evenement_year');
}
}
年份型号:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Year extends Model
{
protected $fillable = ['name'];
public function evenements()
{
// a event can be in several years and I give the name events_years to pivot
return $this->belongsToMany(Evenemnt::class, 'evenement_year');
}
}
当我尝试 SELECT 使用此代码(在 EventementController 中)在索引方法中的所有事件时:
<?php
namespace App\Http\Controllers;
use App\Evenement;
use App\EvenementType;
use App\Type;
use App\Year;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use stdClass;
class EvenementController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$evenements = Evenement::orderBy('year_id')->orderBy('mnemonique')->get();
$years = Year::all();
$evenTypes= EvenementType::all();
$types= Type::All();
return view('evenement.index', compact('evenements', 'years','evenTypes','types'));
}
}
我有这个错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'year_id' in
'order clause' (SQL: select * from evenements
order by year_id
asc, mnemonique
asc)
感谢您的帮助,祝您周日愉快。
编辑:
这是查看代码:
@extends('adminlte::page')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/spectrum-colorpicker2/dist/spectrum.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/spectrum-colorpicker2/dist/spectrum.min.css">
@section('title', 'Cours')
@section('content_header')
<h1>Liste des évènements</h1>
@stop
@section('content')
<p>La liste de tous les évènements enregistrer</p>
<div class="card">
<div class="card-header">
<a href="{{ route('evenement.create') }}" class="btn btn-sm btn-primary">Ajouter un événement</a>
</div>
<div class="filtre">
<p margin:50>Selectionner une année <br>
<SELECT name="filtreAnnée" margin: 50>
<libellé>Selectionner une année</libellé>
<option valeur="tout">Toutes les années</option>
<option valeur="BA1">BA1</option>
<option valeur="BA2">BA2</option>
<option valeur="BA3">BA3</option>
<option valeur="MA1">MA1</option>
<option valeur="MA2">MA2</option>
</SELECT>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Mnémonique</th>
<th>Nom</th>
<th>Année</th>
<th>Couleur</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@foreach ($evenements as $evenement)
<tr style="outline: thin solid">
<td>{{ $evenement->mnemonique }}</td>
<td>{{ $evenement->name }}</td>
<td>{{ $evenement->year->name }}</td>
<td>{{ $evenement->color}}</td>
<td>
<button type="button" class="btn btn-sm btn-warning" id="edit" data-toggle="modal" data-target="#edit-modal-{{ $evenement->id }}">
<i class="far fa-edit"></i>
</button>
@include('evenement.update')
<button type="button" class="btn btn-sm btn-danger" data-toggle="modal" data-target="#delete-modal-{{ $evenement->id }}">
<i class="far fa-trash-alt"></i>
</button>
@include('evenement.delete')
</td>
</tr>
<?php $displayTh = false ?>
@foreach ($evenTypes as $evenT)
@if (!$displayTh)
<?php $displayTh=true ?>
<tr>
<th> </th>
<th>Type de cours </th>
<th>Nombre d'heure</th>
<th>
<button type="button" class= "btn btn-sm btn-primary" data-toggle="modal" data-target="#create-type-modal-{{ $evenement->id }}">
<i class="fa fa-plus-circle" aria-hidden="true"></i>
</button>
@include('evenement.createEvenementType')
</th>
</tr>
@endif
@if ($evenement->id == $evenT->evenement_id )
<tr>
<td> </td>
<td>{{$evenT->type->name}}</td>
<td>{{$evenT->total_hours}}</td>
<td><button type="button" class="btn btn-sm btn-danger" data-toggle="modal" data-target="#delete-type-modal-{{ $evenT->id }}">
<i class="fas fa-minus-circle"></i>
</button>
@include('evenement.deleteEvenementType')
</td>
</tr>
@endif
@endforeach
<tr></tr>
@endforeach
<script>
$(".basic").spectrum();
</script><!-- palette de couleur-->
</tbody>
</table>
</div>
</div>
</div>
@stop
@section('css')
@stop
@section('js')
@stop
编辑 2(添加到数组)
例如,我需要数组 62 中的名称和数组 5 中的名称。
array:62 [▼
0 => array:7 [▼
"id" => 61
"name" => "Accueil"
"mnemonique" => "Accueil"
"color" => "#bcbcbc"
"created_at" => "2021-07-13T14:16:04.000000Z"
"updated_at" => null
"years" => array:2 [▼
0 => array:5 [▼
"id" => 1
"name" => "BA1"
"created_at" => "2021-07-13T14:16:04.000000Z"
"updated_at" => null
"pivot" => array:2 [▶]
]
1 => array:5 [▼
"id" => 4
"name" => "MA1"
"created_at" => "2021-07-13T14:16:04.000000Z"
"updated_at" => null
"pivot" => array:2 [▶]
]
] ]
使用with
我们可以按相关数据排序
升序排列
$evenements = Evenement::with(['years'=>function ($query){
$query->orderBy('year_id');
}])->get();
降序排列
$evenements = Evenement::with(['years'=>function ($query){
$query->orderByDesc('year_id');
}])->get();
用于检索那些有年份的 Evenement
$evenements = Evenement::with(['years'=>function ($query){
$query->orderByDesc('year_id');
}])->has('years')->get();
要获取相关的 table 列,如果它在 blade 文件中那么
@foeach($evenements as $event)
@if(isset($event->years)&&count((array)$event->years))
@foreach($event->years as $year)
{{$year->name??null}}
@endforeach
@endif
@endforeach
一个事件可以是一年到几年,一年可以有多个事件,所以要用到多对多的关系。
所以我有 3 个 table:evenements
、years
和 evenement_year
(枢轴 table)。
我仔细阅读了 Laravel 7 文档并认为我遵循了以下步骤:
晚会模特:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Evenement extends Model
{
protected $fillable = ['name', 'year_id','mnemonique','color'];
//One yar can have severals events and I give the name events_years to pivot
public function years()
{
return $this->belongsToMany(Year::class, 'evenement_year');
}
}
年份型号:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Year extends Model
{
protected $fillable = ['name'];
public function evenements()
{
// a event can be in several years and I give the name events_years to pivot
return $this->belongsToMany(Evenemnt::class, 'evenement_year');
}
}
当我尝试 SELECT 使用此代码(在 EventementController 中)在索引方法中的所有事件时:
<?php
namespace App\Http\Controllers;
use App\Evenement;
use App\EvenementType;
use App\Type;
use App\Year;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use stdClass;
class EvenementController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$evenements = Evenement::orderBy('year_id')->orderBy('mnemonique')->get();
$years = Year::all();
$evenTypes= EvenementType::all();
$types= Type::All();
return view('evenement.index', compact('evenements', 'years','evenTypes','types'));
}
}
我有这个错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'year_id' in 'order clause' (SQL: select * from
evenements
order byyear_id
asc,mnemonique
asc)
感谢您的帮助,祝您周日愉快。
编辑:
这是查看代码:
@extends('adminlte::page')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/spectrum-colorpicker2/dist/spectrum.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/spectrum-colorpicker2/dist/spectrum.min.css">
@section('title', 'Cours')
@section('content_header')
<h1>Liste des évènements</h1>
@stop
@section('content')
<p>La liste de tous les évènements enregistrer</p>
<div class="card">
<div class="card-header">
<a href="{{ route('evenement.create') }}" class="btn btn-sm btn-primary">Ajouter un événement</a>
</div>
<div class="filtre">
<p margin:50>Selectionner une année <br>
<SELECT name="filtreAnnée" margin: 50>
<libellé>Selectionner une année</libellé>
<option valeur="tout">Toutes les années</option>
<option valeur="BA1">BA1</option>
<option valeur="BA2">BA2</option>
<option valeur="BA3">BA3</option>
<option valeur="MA1">MA1</option>
<option valeur="MA2">MA2</option>
</SELECT>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Mnémonique</th>
<th>Nom</th>
<th>Année</th>
<th>Couleur</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@foreach ($evenements as $evenement)
<tr style="outline: thin solid">
<td>{{ $evenement->mnemonique }}</td>
<td>{{ $evenement->name }}</td>
<td>{{ $evenement->year->name }}</td>
<td>{{ $evenement->color}}</td>
<td>
<button type="button" class="btn btn-sm btn-warning" id="edit" data-toggle="modal" data-target="#edit-modal-{{ $evenement->id }}">
<i class="far fa-edit"></i>
</button>
@include('evenement.update')
<button type="button" class="btn btn-sm btn-danger" data-toggle="modal" data-target="#delete-modal-{{ $evenement->id }}">
<i class="far fa-trash-alt"></i>
</button>
@include('evenement.delete')
</td>
</tr>
<?php $displayTh = false ?>
@foreach ($evenTypes as $evenT)
@if (!$displayTh)
<?php $displayTh=true ?>
<tr>
<th> </th>
<th>Type de cours </th>
<th>Nombre d'heure</th>
<th>
<button type="button" class= "btn btn-sm btn-primary" data-toggle="modal" data-target="#create-type-modal-{{ $evenement->id }}">
<i class="fa fa-plus-circle" aria-hidden="true"></i>
</button>
@include('evenement.createEvenementType')
</th>
</tr>
@endif
@if ($evenement->id == $evenT->evenement_id )
<tr>
<td> </td>
<td>{{$evenT->type->name}}</td>
<td>{{$evenT->total_hours}}</td>
<td><button type="button" class="btn btn-sm btn-danger" data-toggle="modal" data-target="#delete-type-modal-{{ $evenT->id }}">
<i class="fas fa-minus-circle"></i>
</button>
@include('evenement.deleteEvenementType')
</td>
</tr>
@endif
@endforeach
<tr></tr>
@endforeach
<script>
$(".basic").spectrum();
</script><!-- palette de couleur-->
</tbody>
</table>
</div>
</div>
</div>
@stop
@section('css')
@stop
@section('js')
@stop
编辑 2(添加到数组)
例如,我需要数组 62 中的名称和数组 5 中的名称。
array:62 [▼
0 => array:7 [▼
"id" => 61 "name" => "Accueil" "mnemonique" => "Accueil" "color" => "#bcbcbc" "created_at" => "2021-07-13T14:16:04.000000Z" "updated_at" => null "years" => array:2 [▼ 0 => array:5 [▼ "id" => 1 "name" => "BA1" "created_at" => "2021-07-13T14:16:04.000000Z" "updated_at" => null "pivot" => array:2 [▶] ] 1 => array:5 [▼ "id" => 4 "name" => "MA1" "created_at" => "2021-07-13T14:16:04.000000Z" "updated_at" => null "pivot" => array:2 [▶] ] ] ]
使用with
我们可以按相关数据排序
升序排列
$evenements = Evenement::with(['years'=>function ($query){
$query->orderBy('year_id');
}])->get();
降序排列
$evenements = Evenement::with(['years'=>function ($query){
$query->orderByDesc('year_id');
}])->get();
用于检索那些有年份的 Evenement
$evenements = Evenement::with(['years'=>function ($query){
$query->orderByDesc('year_id');
}])->has('years')->get();
要获取相关的 table 列,如果它在 blade 文件中那么
@foeach($evenements as $event)
@if(isset($event->years)&&count((array)$event->years))
@foreach($event->years as $year)
{{$year->name??null}}
@endforeach
@endif
@endforeach