我想使用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返回(“课程查找”):
{
"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"
},{ ... }
],
}
答案 0 :(得分:2)
首先,您需要调整一些关系。您之间存在许多关系,因此模型应如下所示:
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"
]
]
答案 1 :(得分:2)
使用belongsToMany
关系:
在您的Course
模型中:
public function contents()
{
return $this->belongsToMany(Contents::class, 'course_contents');
}
然后,使用$course->contents;
此函数返回课程的所有内容模型。
希望有帮助。
答案 2 :(得分:0)
多对多关系是通过在contents
模型中的关系方法Course
中返回belongsToMany关系来定义的。如Laravel many-to-many documentation所述。
要仅检索多对多关系中的Content
个项目而不是数据透视表列,则应将关系实例从App\CourseContent
更改为App\Content
。
答案 3 :(得分:0)
在内容模型中
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();