Eager loading et contrainte sur la requête principale

Ce sujet est résolu
47049
,

Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

J'ai écrit une requête qui me permet de faire une recherche avancée sur mon site. Les résultats sont liés à un modèle et j'utilise donc l'eager loading pour les charger. Mon code ressemble à ça :

$data = InvestorData::query()
    ->when($investment_min, function ($query, $investment_min) {
        return $query->where('funding_min', '>=', $investment_min);
    })
    ->when($investment_max, function ($query, $investment_max) {
        return $query->where('funding_max', '<=', $investment_max);
    })
    ->when($investment_type, function ($query, $investment_type) {
        return $query->where('funding_type', '=', $investment_type);
    })
    ->when($investment_step, function ($query, $investment_step) {
        return $query->where('funding_step', '=', $investment_step);
    })
    ->with(['structure' => function ($query) {
        $query->verified();
    }])
    ->paginate($paginate);

Ce que je veux

Ce que je cherche à obtenir, c'est tout simplement la liste des InvestorData qui remplissent les conditions des méthodes when (ce qui fonctionne avec mon code) mais également pouvoir filtrer ces résultats en fonction de contraintes appliquées sur la relation.

Ce que j'obtiens

Avec le code que j'ai écrit, je n'obtient pas ce que je voulais car, en effet, les contraintes appliquées à Structure sont exécutées sur la relation et non l'ensemble des résultats. Ainsi j'obtiens bien à la fin une liste de résultats mais dont la relation est null.

Voila, si vous connaissez un moyen de le faire nativement avec Laravel et Eloquent je suis preneur car, dans un souci de garder le code aussi propre que possible, j'aimerai ne pas avoir à écrire un algorithme lourd pour le faire.

2 Réponse

35326
,

Salut, with charge la relation qu'elle soit nulle ou non. Si tu veux que la relation existe, il faut coupler le with avec un whereHas('stucture')

47049
,

Merci beaucoup !