Как стремиться к загрузке только 1 результата от многих ко многим отношениям Laravel - PullRequest
1 голос
/ 13 апреля 2020

Как я могу загружать только одну из множества отношений?

У меня есть две модели Application & Applicant

Models\Application.php

public function applicants() {
    return $this->belongsToMany(Applicant::class);
}

public function oneApplicant() {
    return $this->applicants()->first();
}

Я хочу разбить страницы на приложения и хочу загрузить только одного кандидата (если он есть).

return Application::stage( $stages )
->stagenot($stageNot)
->refered( $refered, $term )
->with(['oneApplicant'])
->orderBy('created_at','desc')->paginate( $count );

Но это не работает. Получение первого результата, подобного этому, return $this->applicants()->first() приведет к ошибке Call to undefined method Illuminate\Database\Query\Builder::with()

Если я также поставлю ограничение вместо первого return $this->applicants()->limit(1), то в последней коллекции будет показан только один кандидат.

Я также попытался изменить запрос непосредственно при активном вызове загрузки, чтобы получить первую строку

return Application::with(['applicants',  => function( $query ) {
        $q->first();
    }])->orderBy('created_at','desc')->paginate( $count );

Но результат такой же, как добавление limit(1) непосредственно в отношении, оно добавит только один заявитель на последний элемент из коллекции, а другой элемент имеет пустое значение массива

Может кто-нибудь помочь:)

Спасибо

1 Ответ

0 голосов
/ 14 апреля 2020

Я понял, что это слишком сложно, чтобы достичь этого сам, и в итоге использовал пакет eloquent-eager-limit из staudenmeir (большое ему спасибо, сэкономьте мне часы работы :) )

вот моя модель

class Application extends BaseModel {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;

    public function applicants() {
        return $this->belongsToMany(Applicant::class);
    }

    public function oneApplicant() {
        return $this->applicants()->limit(1);
    }
}

Тогда я смог использовать ее на своем контроллере

return Application::stage( $stages )
    ->stagenot($stageNot)
    ->refered( $refered, $term )
    ->with([
        'oneApplicant',
        'oneApplicant.onePhone:model_id,number',
        'oneApplicant.oneAddress:model_id,state'
    ])->orderBy('created_at','desc')->paginate( $count );

...