Я пытаюсь создать форум с разделами и категориями в laravel 5.7. Все эти разделы имеют несколько категорий.

Когда я строю отношения и пытаюсь получить данные в представлении, я получаю сообщение об ошибке:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 
'forum_categories.forum_section_id' in 'where clause' (SQL: select * from `forum_categories` where `forum_categories`.`forum_section_id` = 1 and `forum_categories`.`forum_section_id` is not null) 

Это мой клинок

@foreach($sections as $section) 
                        <h1 data-toggle="collapse" data-target="#section{{$section->id}}">{{$section->name}}</h1>
                        <div class="collapse" id="section{{$section->id}}">
                            Dit is sectie
                            @foreach($section->ForumCategory as $forumCategory)
                                {{$forumCategory->id}}
                                @endforeach
                        </div>
 @endforeach

Моя функция контроллера index ():

    $sections = ForumSection::all();
    return view('forum.index', compact(['sections'])); 

А это Мои модели: < Сильный > ForumCategory

namespace App;

use Illuminate\Database\Eloquent\Model;


class ForumCategory extends Model
{
  protected $fillable = [
     'name', 'active', 'position', 'section_id'
  ];
  public function ForumSection() {
     return $this->belongsTo(ForumSection::class, 'section_id');
  }
}

Раздел Модельного форума :

 <?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ForumSection extends Model
{
    protected $fillable = [
        'name','active', 'position'
    ];
    public function ForumCategory() {
        return $this->hasMany(ForumCategory::class, 'section_id');
    }
}

И последнее: мои 2 таблицы базы данных:

< Сильный > ForumSectionsTable

public function up()
    {
            Schema::create('forum_sections', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->boolean('active');
            $table->integer('position')->unique();
            $table->timestamps();
    });
}

< Сильный > ForumCategoriesTable

    public function up()
{
    Schema::create('forum_categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->integer('active');
        $table->integer('section_id')->unsigned();
        $table->timestamps();
    });
    Schema::table('forum_categories', function (Blueprint $table)
    {
        $table->foreign('section_id')->references('id')->on('forum_sections');
    });
}

Может кто подскажет, что я сделал не так?

0
Sander van Hoogdalem 24 Сен 2018 в 21:33

2 ответа

Лучший ответ

Решение было простым ... Я переименовал ForumCategory и ForumSection в Category и Section, и проблема исчезла ... Я усвоил урок;)

0
Sander van Hoogdalem 24 Сен 2018 в 19:50

Это должно быть довольно ясно ... Он ищет

'forum_categories.forum_section_id'

В качестве идентификатора ссылки, но вы используете

Schema::create('forum_categories', function (Blueprint $table) {
  ...
  $table->integer('section_id')->unsigned();
});

Чтобы решить эту проблему, у вас есть несколько вариантов: переопределить миграцию и использовать forum_section_id вместо section_id или добавить идентификатор в ваши отношения:

return $this->hasMany(ForumCategory::class, 'section_id');

Вы сделали это правильно для метода belongsTo, но, похоже, пропустили это для метода hasMany (обратного).

Затем используйте цикл для получения одного id, поскольку $seciton->ForumCategory - это Collection, а не отдельная модель:

@foreach($section->ForumCateogry AS $forumCateogry)
Dit is sectie {{ $forumCateogry->id }}
@endforeach

Это вызывает примечание о соглашениях об именах; имена методов обычно имеют "camelCase", поэтому forumCateogry() вместо ForumCateogry() и во множественном числе для методов, возвращающих несколько, поэтому forumCateogries() вместо forumCateogry()

2
Tim Lewis 24 Сен 2018 в 18:47