Laravel定义关系

时间:2015-09-28 17:53:37

标签: php laravel laravel-4 relationships table-relationships

我有一个名为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:从contents中选择* contentscourse_id = 1)

我不能纠正关系中的问题,因为我是laravel的新手。

4 个答案:

答案 0 :(得分:1)

关闭,但你的关系倒退了。具有外键的表是属于另一个的表。在这种情况下,您的course表格中包含外键content_id,因此Course属于ContentContent有一个或多个Course

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我真的不明白你的桌子设计,也许它应该是这样的。

接受你的陈述:“课程表有很多content_id ”。我觉得你说1门课程可以有多个内容,是吗?如果是,您可能希望将表格设计更改为如下所示

void updateRegions() {
    computeClosestGridCoord(myPosition); // which is center of your current region
    lookForNeighbourRegions(regionsArray); // and add new Region if needed
    deleteOldRegionsStuff(regionsArray);
}

内容迁移代码

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');
    }
}

OR

$course = Course::with('content')->get();

答案 3 :(得分:0)

这是关于确定关联。你的协会应该是:

内容 内容有很多课程

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;