如何在Laravel中雄辩地检索具有多个表的多个关系

时间:2019-08-23 13:59:45

标签: laravel eloquent

我正在使用Laravel 5.8建立一个保姆站点。我有4个具有不同关系的表,如下所示:

please see this image

这些关系是:

Babysitter->hasMany(session)
Sessions->hasOne(Review)
Sessions->hasOne(Kids)
Sessions->hasOne(Babysitter)
Sessions->hasOne(Parent)

我想实现两件事:

第一个

我想列出所有保姆时显示此结果。我正在为每个保姆显示此信息:

plsease see this image

在这里看到我没能实现的

plsease see this image

这是我的代码

Sitters::where('Status', 'active')->where('Verified', 1)->get();

第二个

此外,我还尝试通过家长评价向孩子们展示姓名,如下所示:

plsease see this image

这就是我正在使用的

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

2 个答案:

答案 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上声明了kidsreviewSession::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();

我希望这可以帮助某人:)