Laravel 定义关系

Laravel Defining Relationships

我有一个 table 叫 Content 是大师 table 喜欢

Content : id content_name created_at updated_at

还有一个tableCourse喜欢

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]: Column not found: 1054 Unknown column 'contents.course_id' in 'where clause' (SQL: select * from contents where contents.course_id = 1)

由于我是 laravel 的新手,我无法纠正关系中的问题。

在你的迁移(create_courses_table)中,确保设置 外键

$table->integer('content_id)->unsigned()->index();
            $table->foreign('content_id')
                  ->references('id')
                  ->on('contents')
                  ->onDelete('cascade');

很接近,但是你的人际关系倒退了。有外键的table就是那个属于另一个的。在这种情况下,您的 course table 具有外键 content_id,因此 Course 属于 Content,并且 Content 具有一个或多个 Courses.

class Content extends Eloquent {
    public function course() {
        return $this->hasMany('Course');
    }
}

class Course extends Eloquent {
    public function content() {
        return $this->belongsTo('Content');
    }
}

我不是很理解你的table设计,也许应该是这样的。

接受您的陈述:“课程 table 有许多 content_id”。我明白你是说一门课程可以有多个内容,对吗?如果是,您可能希望将 table 设计更改为如下所示

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;