我正在使用Laravel 5.8建立一个保姆站点。我有4个具有不同关系的表,如下所示:
这些关系是:
Babysitter->hasMany(session)
Sessions->hasOne(Review)
Sessions->hasOne(Kids)
Sessions->hasOne(Babysitter)
Sessions->hasOne(Parent)
我想实现两件事:
第一个
我想列出所有保姆时显示此结果。我正在为每个保姆显示此信息:
在这里看到我没能实现的
这是我的代码
Sitters::where('Status', 'active')->where('Verified', 1)->get();
第二个
此外,我还尝试通过家长评价向孩子们展示姓名,如下所示:
这就是我正在使用的
Sessions::select('Reviews.*', 'Sessions.Parent_id')->join('Reviews', 'Reviews.Session_id', '=', 'Sessions.id')->with('owner')->where('Trainer_id', session('user')->Id)->where('Status', '=', 'complete')->with('owner')->orderBy('Sessions.id', 'DESC')->get();
这里是Session.php
模型
public function owner(){
return $this->belongsTo('App\Models\Parents', 'Parent_id');
}
答案 0 :(得分:0)
正如所讨论的,改变关系:
Babysitter->hasMany(sesstion)
Sessions->hasOne(Review)
Sessions->belongsTo(Kids)
Sessions->belongsTo(Babysitter)
Sessions->belongsTo(Parent)
第一个
在Babysitter.php
中声明以下属性
class Babysitter extends Model
{
public function reviews()
{
$this->hasManyThrough(Review::class, Session::class);
}
public function getAverageReviewAttribute()
{
return $this->reviews()->avg('Rating');
}
}
然后,您只需要在模型实例上调用它即可。
$babysitter = Babysitter::first();
return $babysitter->average_review;
第二个
只需使用关系
$babysitter = BabySitter::with(['sessions' => public function ($session) {
$session->with(['review','parent','kids']);
})->where('trainer_id', '=', session('user')->Id) //did not understand this condition
->first();
这假设您在parent
上声明了kids
,review
和Session::class
关系。 (如果需要,请更改名称)
答案 1 :(得分:0)
经过几天的搜索和测试,这对我有用:
在(保姆)内部模型中,建立此关系
public function sessions()
{
return $this->hasMany(Sessions::class, 'sitter_id')
->withCount('reviews')
->withCount(['reviews as review_avg' => function($query){
$query->select(DB::raw('AVG(Rating)'));
}]);
}
此外,在(会话)模型中,放置此关系
public function reviews()
{
return $this->hasOne(Reviews::class, 'Session_id');
}
现在您这样查询
return $sitters = Sitters::with('sessions')->get();
我希望这可以帮助某人:)