【问题标题】:Laravel 7 Relationship many to many not workingLaravel 7关系多对多不起作用
【发布时间】:2021-07-19 00:36:23
【问题描述】:

一个事件可以在一年到几年,一年可以有几个事件,因此使用了多对多的关系。

所以我有 3 个表:evenementsyearsevenement_year(数据透视表)。

我仔细阅读了 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');
        
    }
}

当我尝试在索引方法中使用此代码(在 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]:未找到列:1054 中的未知列 'year_id' 'order 子句' (SQL: select * from evenements order by year_id 升序,mnemonique升序)

感谢您的帮助,祝您周日愉快。

编辑:

这是查看代码:

@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(dd 到数组)

例如,我需要 array62 中的名称和数组 5 中的名称。

array:62 [▼   

0 => 数组: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 [▶]
  ]
]   ]

【问题讨论】:

  • 尝试添加受保护的 $table="events";在 Evenement 模型中,或者您可能有 evenements 表但 year_id 列不存在。但是根据错误,您有 evenements 表,但列不存在,但在您的问题中,您提到表名是 events
  • 我可以知道 Evenement 模型数据库中的表名吗?您提到了 events 表,但根据错误它的evenements 表
  • 是的,这是晚上,抱歉我修改了。我把 protected $table="evenements";但它不起作用。
  • 检查 year_id 列是否存在于 evenements 表中。根据我的说法,它在 evenement_year 表中,因为您使用的是数据透视表不是吗?
  • 不,它不存在,但是我通过模型绑定了事件(事件)和年份,为什么我不能从数据透视表中获取 year_id ?感谢您的帮助。

标签: laravel laravel-7


【解决方案1】:

使用with我们可以根据相关数据排序

升序

$evenements = Evenement::with(['years'=>function ($query){
                     $query->orderBy('year_id');
              }])->get();

降序

 $evenements = Evenement::with(['years'=>function ($query){
                         $query->orderByDesc('year_id');
                  }])->get();

用于检索那些有年份的晚报

 $evenements = Evenement::with(['years'=>function ($query){
                             $query->orderByDesc('year_id');
                      }])->has('years')->get();

如果它在刀片文件中,则获取相关的表列

@foeach($evenements as $event)
 
  @if(isset($event->years)&&count((array)$event->years))
    @foreach($event->years as $year)

      {{$year->name??null}}
    @endforeach
  @endif
 
@endforeach

【讨论】:

  • 太好了,谢谢。请问如何在查询中添加名称字段(年份表中的名称)?再次感谢您。
  • 你想从年表中获取名字吗?如果是这样,那么您可以循环 $evenements 并在循环内部 $value->years->name.above 代码返回所有 Evenement,即使它在几年内为空。如果您只想获取那些有年份的 Evenement,请检查我的更新答案跨度>
  • 感谢您发布的版本。我有此错误:此集合实例上不存在属性 [名称]。 (查看:/Applications/MAMP/htdocs/overlap_150721/resources/views/evenement/index.blade.php)不接受年表的name属性。
  • @DavidDubois 看起来很少有没有几年的时间,所以像我回答的那样更好的空检查
  • 每个活动都有一年。
猜你喜欢
  • 2021-12-08
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
相关资源
最近更新 更多