Laravel France

Problème de relations Récupérer tous les utilisateurs d'une relation parents-enfants + self

Avatar de VassiliJoffroy
VassiliJoffroy

Bonjour,

ca peut paraitre bizarre mais avec le code vous allez vite comprendre,

je cherche à crée une relation dans ma relation déjà existante :

J'ai un Utilisateur qui appartient à une entreprise, une entreprise a plusieurs entreprises :

/**
 * @return BelongsToMany
 */
public function children(): BelongsToMany
{
    return $this->belongsToMany(
        self::class,
        'structure_child',
        'parent_id',
        'child_id')
        ->withTrashed();
}
 
/**
 * @return BelongsToMany
 */
public function parents(): BelongsToMany
{
    return $this->belongsToMany(
        self::class,
        'structure_child',
        'child_id',
        'parent_id')
        ->withTrashed();
}

et j'ai beau chercher mais j'y arrives pas, je veux récupérer tout les utilisateur de l'entreprise de l'utilisateur avec tous ses enfants :

j'ai essayé :

public function childrenSelf()
    {
        return $this->children()->with('childrenSelf');
    }
 
    public function childrenAndSelf()
    {
        return Structure::whereIn('id', $this->childrenAndSelfIds())->get();
    }
 
    public function scopeWithChildren($query)
    {
        return $query->whereIn('id', $this->childrenAndSelfIds());
    }
 
    /**
     * @return mixed
     */
    public function childrenAndSelfIds()
    {
        $ids = $this->childrenIds();
        $ids[] = $this->id;
        return $ids;
    }
 
    /**
     * @return mixed
     */
    public function childrenIds()
    {
        return $this->children->modelKeys();
    }

actuellement je fais comme ça :

User::whereIn('id', Auth::user()->structure->childrenAndSelfIds())->get();

ça marche okay mais ce n'est pas propre et pas fonctionnel, je l'utilise énormément de fois, j'aimerais récupérer avec une sorte de

Auth::user()->structure->allUsers

vous voyez ?

J'ai essayé d'être clair mais c'est vachement compliqué !

Je reste à votre disposition pour vos questions et merci d'avance !

Posté il y a 1 mois
Avatar de Rezrazi
Rezrazi

Hello,

Si je comprends bien ton use case, ta relation devrait être comme ça:

dans ta migration

$table->foreignId('parent_id')->nullable()->constrained('<le_nom_de_ta_table>')->nullOnDelete();
// pas besoin de child_id

dans ton model

    public function parent() {
        return $this->belongsTo(self::class, 'parent_id');
    }

    public function children() {
        return $this->hasMany(self::class, 'parent_id');
    }

// pour avoir les sous entreprise d'une entreprise

$structure = Structure::find(1);
$children_structures = $structure->children;

// pour avoir l'entreprise parente

$parent_structure = $structure->parent;

// pour avoir les sous entreprise de l'entreprise d'un utilisateur

$user->structure->children;

je sais pas si ça répond à ta demande, sinon pense à rajouter plus de détails sur le résultat attendu

Posté il y a 1 mois
Avatar de VassiliJoffroy
VassiliJoffroy

Bonjour,

c'est une relation many to many, donc je pense avoir besoin de child car si je met pas de child chaque structure peut avoir que 1 parent hors ici, ce n'est pas le cas, je récupère déjà $user->structure->children mais je ne récupère pas les 2 en même temps, la sienne et ses enfants, je veux faire les choses en 1 seule ligne, mais j'ai réfléchi et récupérer les ids c'est plutot rapide (j'ai fait des tests sql)

merci

Posté il y a 1 mois

Vous ne pouvez pas répondre à ce sujet.