У меня есть одна таблица с именем Content
которая является основной таблицей, как
Content : id content_name created_at updated_at
и другой стол Course
лайк
Course table have many content_id
Course : id content_id course_name created_at updated_at
Я создал отношения, как это.
Content Model
class Content extends Eloquent {
protected $table = 'contents';
protected $guarded = array('id');
public function course()
{
return $this->belongsTo('Course');
}
}
Course Model
class Course extends Eloquent {
protected $table = 'courses';
protected $guarded = array('id');
public function content()
{
return $this->hasMany('Content');
}
}
Когда я получаю данные, как это
$courses=Course::find(1)->content;
Выдает ошибку вроде
SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец ‘contents.course_id’ в ‘предложении where’ (SQL: select * from
contents
гдеcontents
,course_id
= 1)
Я не могу исправить проблему в отношениях, поскольку я новичок в Laravel.
Близко, но у вас ваши отношения задом наперед. Таблица, которая имеет внешний ключ, является той, которая принадлежит другой. В этом случае ваш course
таблица имеет внешний ключ content_id
, следовательно Course
принадлежит Content
, а также Content
имеет один или много Course
s.
class Content extends Eloquent {
public function course() {
return $this->hasMany('Course');
}
}
class Course extends Eloquent {
public function content() {
return $this->belongsTo('Content');
}
}
в ваших миграциях (create_courses_table), обязательно установите иностранный ключ как это ,
$table->integer('content_id)->unsigned()->index();
$table->foreign('content_id')
->references('id')
->on('contents')
->onDelete('cascade');
Я не очень понимаю ваш дизайн стола, может быть, это должно быть что-то вроде этого.
Принимая ваше заявление: «Таблица курса имеет много content_id«. Я понимаю, что вы говорите, что 1 курс может иметь несколько материалов, верно? Если да, вы можете изменить дизайн таблицы на что-то вроде ниже
Course
======
id
course_name
created_at
updated_at
Content
=======
id
course_id (set this as FK)
content_name
created_at
updated_at
код миграции для контента
public function up()
{
Schema::create('content', function(Blueprint $table)
{
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('course_id')->unsigned();
$table->string('content_name');
});
Schema::table('content',function($table)
{
$table->foreign('course_id')->references('id')->on('course')->onDelete('cascade');
});
}
Тогда в вашей модели
class Course extends Eloquent
{
protected $table = 'course';
public function content()
{
return $this->hasMany('content', 'course_id', 'id');
}
}
class Content extends Eloquent
{
protected $table = 'content';
public function course()
{
return $this->belongsTo('course', 'course_id', 'id');
}
}
Затем получить доступ к вашим данным через нетерпеливую загрузку
$course = Course::with('content')->get();
ИЛИ ЖЕ
$content = Content::with('course')->get();
Это об определении ассоциаций. Ваши ассоциации должны быть:
содержание
Содержание имеет много курсов
class Content extends Eloquent {
protected $table = 'contents';
protected $guarded = array('id');
public function courses()
{
return $this->hasMany('Course');
}
}
Курс
Курс относится к содержанию.
class Course extends Eloquent {
protected $table = 'courses';
protected $guarded = array('id');
public function content()
{
return $this->belongsTo('Content');
}
}
Таким образом, вы можете сделать запрос ассоциации.
Для поиска контента -> курсы:
$courses = Content::find(1)->courses;
Для нахождения курса -> содержание:
$content = Course::find(1)->content;