首页 > 解决方案 > laravel 将自定义另一个查询添加到 releatinship

问题描述

laravel我有这个工作正常的查询,

$months = Month::with(['lessons' => function ($query) {
    $query->with(['files']);
}])->get();

在这个查询中,我有$query->with(['files'])它是:

public function files()
{
    return $this->hasMany(LessonFiles::class);
}

我想为所有具有以下内容的$query->with(['files'])行添加此查询lesson_file_key

LessonsView::whereLessonFileKey($lessonFile->lesson_file_key)->count()

这意味着我想$query->with(['files'])通过添加上面的代码来获取此查询中每一行的计数,例如:

$months = Month::with(['lessons' => function ($query) {
    $req = $query->with(['files']);
    // for example using foreach on $req
    // LessonsView::whereLessonFileKey($req->lesson_file_key)->count()
}])->get();

我的模型:

class Month extends Model
{
    protected $guarded = ['id'];
    protected $hidden = ['id'];

    public function lessons()
    {
        return $this->hasMany(Lesson::class);
    }

    public function files()
    {
        return $this->hasMany(MonthFiles::class);
    }
}
class Lesson extends Model
{
    protected $guarded = ['id'];
    protected $hidden = ['id', 'month_id', 'filename', 'file_url'];

    public function month()
    {
        return $this->belongsTo(Month::class);
    }

    public function files()
    {
        return $this->hasMany(LessonFiles::class);
    }
}
class LessonFiles extends Model
{
    protected $guarded = ['id'];
    protected $hidden = ['id', 'lesson_id', 'filename', 'file_url'];

    public function lesson()
    {
        return $this->belongsTo(Lesson::class);
    }

    public function visits(){
        return $this->hasMany(LessonsView::class);
    }
}
class LessonsView extends Model
{
    protected $guarded = ['id'];
    protected $hidden = ['id','user_id','lesson_files_id','lesson_file_key','ip_address'];

    public function visitedLesson(){
        return $this->belongsTo(LessonFiles::class);
    }
}

标签: laravel

解决方案


withCount像这样使用whereColumn

$months = Month::with(['lessons' => function ($query) {
    $query->with(['files' => function($q) {
       $q->withCount(['visits' => function($vq) {
           $vq->whereColumn('lesson_views.lesson_file_key', 'lesson_files.lesson_file_key')
        }]);       
    }]);
}])->get();

推荐阅读