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
具有一个或多个 Course
s.
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;
我有一个 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
wherecontents
.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
具有一个或多个 Course
s.
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;