Laravel получить коллекцию, которая соответствует условию на другой модели - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть две модели:

Class Survey{
    public function steps(){
        return $this->hasMany( Step::class );
    }
}

Class Step{
    public function survey(){
        return $this->belongsTo( Survey::class );
    }

    public function isFinished( Survey $survey ){
        // Check some things
        return ( /* Chech if that step of the survey is finished */ ) ? true : false;
    }
}

В моем контроллере я хочу получить все опросы, которые завершили определенный шаг.

public function getFinished( Step $step ){
    $finished = collect();
    $surveys = Survey::all();
    foreach( $surveys as $survey ){
        if( $step->isFinished( $survey ) ){
            $finished->push( $survey );
        }
    }
    return $finished;
}

Я знаю, что это неэффективный способ сделать это.Я хотел бы сделать это из модели со статической функцией, чтобы я мог сделать что-то вроде:

public function getFinished( Step $step ){
    return Survey::getFinished( $step );
}

1 Ответ

0 голосов
/ 11 сентября 2018

Вы можете использовать whereHas():

public function getFinished(Step $step) {
    return Survey::whereHas('steps', function($query) use($step) {
        $query->where('id', $step->id)->where('isFinished', 1);
    })->get();
}
...