多重关系 Laravel - 对象中的对象
Multiple Relationship Laravel - Object in Object
我想使用 Laravel Eloquent 建立关系,但我在访问关系中的特定筛选对象时遇到问题。
我的对象:
courses:
id - integer
name - string
contents:
id - integer
name - string
course_contents:
id - integer
course_id - integer
content_id - integer
我想通过课程获取内容。到现在只能过滤course_contents来过滤内容
我的控制器:
Course::hasContents()->find($id);
课程模型
public function contents()
{
return $this->hasMany('App\CourseContent');
}
public function scopeHasContents($query)
{
$query->with(['contents' => function($contentQuery) {
$contentQuery->has('content')->with('content');
}]);
}
课程内容模型:
public function content()
{
return $this->hasOne('App\Content', 'id');
}
我的 json return(课程查找):
{
"id":1,
"name":"Course Example 1",
"contents":[
{
"id":1,
"course_id":1,
"content_id":1,
"deleted_at":null,
"created_at":"2019-07-16 17:31:05",
"updated_at":"2019-07-16 17:31:05",
"content":{
"id":1,
"name":"Content Example 1",
"deleted_at":null,
"created_at":"2019-07-16 17:31:05",
"updated_at":"2019-07-16 17:31:05"
}
},
{
"id":2,
"course_id":1,
"content_id":2,
"deleted_at":null,
"created_at":"2019-07-16 17:31:05",
"updated_at":"2019-07-16 17:31:05",
"content":{
"id":2,
"name":"Content Example 2",
"deleted_at":null,
"created_at":"2019-07-16 17:31:05",
"updated_at":"2019-07-16 17:31:05"
}
},{ ... }
],
}
我需要的:
{
"id":1,
"name":"Course Example 1",
"contents":[
{
"id":1,
"name":"Content Example 1",
"deleted_at":null,
"created_at":"2019-07-16 17:31:05",
"updated_at":"2019-07-16 17:31:05"
},
{
"id":2,
"name":"Content Example 2",
"deleted_at":null,
"created_at":"2019-07-16 17:31:05",
"updated_at":"2019-07-16 17:31:05"
},{ ... }
],
}
many-to-many 关系是通过在 Course
模型的关系方法 contents
中返回一个 belongsToMany 关系来定义的。如 Laravel many-to-many documentation.
中所述
要仅检索多对多关系中的 Content
项而不是数据透视列,您应该将关系实例从 App\CourseContent
更改为 App\Content
。
在内容模型中
public function course()
{
return $this->hasMany('App\Course');
}
在课程模型中
public function content()
{
return $this->hasMany('App\Content');
}
你可以做到
Course::with('content')->find($id)
或
Content::whereHas('course',function($q)use($id){
$q->where('id',$id)
})->get();
首先,你需要稍微调整一下关系。您有多对多关系,因此模型应如下所示:
Course.php
public function contents()
{
return $this->belongsToMany(Content::class, 'course_contents');
}
Content.php
protected $hidden = ['pivot'];
public function courses()
{
return $this->belongsToMany(Course::class, 'course_contents');
}
您可以检索 contents
数据,如下所示:
例如:您想获取课程的所有内容 1
Content::whereHas('courses', function($query) {
$query->where('courses.id', 1);
})->get();
// You need to pass course id dynamically but for demonstration, I hard coded it.
这将为您提供以下结果:
array:1 [
0 => array:2 [
"id" => 1
"name" => "Content 1"
]
]
使用belongsToMany
关系:
在您的 Course
模型中:
public function contents()
{
return $this->belongsToMany(Contents::class, 'course_contents');
}
然后,使用$course->contents;
此函数returns课程的所有内容模型。
希望对您有所帮助。
我想使用 Laravel Eloquent 建立关系,但我在访问关系中的特定筛选对象时遇到问题。
我的对象:
courses:
id - integer
name - string
contents:
id - integer
name - string
course_contents:
id - integer
course_id - integer
content_id - integer
我想通过课程获取内容。到现在只能过滤course_contents来过滤内容
我的控制器:
Course::hasContents()->find($id);
课程模型
public function contents()
{
return $this->hasMany('App\CourseContent');
}
public function scopeHasContents($query)
{
$query->with(['contents' => function($contentQuery) {
$contentQuery->has('content')->with('content');
}]);
}
课程内容模型:
public function content()
{
return $this->hasOne('App\Content', 'id');
}
我的 json return(课程查找):
{
"id":1,
"name":"Course Example 1",
"contents":[
{
"id":1,
"course_id":1,
"content_id":1,
"deleted_at":null,
"created_at":"2019-07-16 17:31:05",
"updated_at":"2019-07-16 17:31:05",
"content":{
"id":1,
"name":"Content Example 1",
"deleted_at":null,
"created_at":"2019-07-16 17:31:05",
"updated_at":"2019-07-16 17:31:05"
}
},
{
"id":2,
"course_id":1,
"content_id":2,
"deleted_at":null,
"created_at":"2019-07-16 17:31:05",
"updated_at":"2019-07-16 17:31:05",
"content":{
"id":2,
"name":"Content Example 2",
"deleted_at":null,
"created_at":"2019-07-16 17:31:05",
"updated_at":"2019-07-16 17:31:05"
}
},{ ... }
],
}
我需要的:
{
"id":1,
"name":"Course Example 1",
"contents":[
{
"id":1,
"name":"Content Example 1",
"deleted_at":null,
"created_at":"2019-07-16 17:31:05",
"updated_at":"2019-07-16 17:31:05"
},
{
"id":2,
"name":"Content Example 2",
"deleted_at":null,
"created_at":"2019-07-16 17:31:05",
"updated_at":"2019-07-16 17:31:05"
},{ ... }
],
}
many-to-many 关系是通过在 Course
模型的关系方法 contents
中返回一个 belongsToMany 关系来定义的。如 Laravel many-to-many documentation.
要仅检索多对多关系中的 Content
项而不是数据透视列,您应该将关系实例从 App\CourseContent
更改为 App\Content
。
在内容模型中
public function course()
{
return $this->hasMany('App\Course');
}
在课程模型中
public function content()
{
return $this->hasMany('App\Content');
}
你可以做到
Course::with('content')->find($id)
或
Content::whereHas('course',function($q)use($id){
$q->where('id',$id)
})->get();
首先,你需要稍微调整一下关系。您有多对多关系,因此模型应如下所示:
Course.php
public function contents()
{
return $this->belongsToMany(Content::class, 'course_contents');
}
Content.php
protected $hidden = ['pivot'];
public function courses()
{
return $this->belongsToMany(Course::class, 'course_contents');
}
您可以检索 contents
数据,如下所示:
例如:您想获取课程的所有内容 1
Content::whereHas('courses', function($query) {
$query->where('courses.id', 1);
})->get();
// You need to pass course id dynamically but for demonstration, I hard coded it.
这将为您提供以下结果:
array:1 [
0 => array:2 [
"id" => 1
"name" => "Content 1"
]
]
使用belongsToMany
关系:
在您的 Course
模型中:
public function contents()
{
return $this->belongsToMany(Contents::class, 'course_contents');
}
然后,使用$course->contents;
此函数returns课程的所有内容模型。
希望对您有所帮助。