web-dev-qa-db-fra.com

Laravel 5 relation hasMany sur deux colonnes

Est-il possible d'avoir une relation hasMany sur deux colonnes?

Ma table comporte deux colonnes, user_id Et related_user_id.

Je veux que ma relation corresponde à l'une des colonnes.

Dans mon modèle, j'ai

public function userRelations()
{
    return $this->hasMany('App\UserRelation');
}

Qui exécute la requête: select * from user_relations where user_relations.user_id in ('17', '18').

La requête que je dois exécuter est:

select * from user_relations where user_relations.user_id = 17 OR user_relations.related_user_id = 17 

MODIFIER:

J'utilise un chargement passionné et je pense que cela affectera la façon dont cela devra fonctionner.

$cause = Cause::with('donations.user.userRelations')->where('active', '=', 1)->first();
15
CharliePrynn

Je ne pense pas qu'il soit possible de faire exactement ce que vous demandez.

Je pense que vous devez les traiter comme des relations distinctes, puis créer une nouvelle méthode sur le modèle pour récupérer une collection des deux.

public function userRelations() {
    return $this->hasMany('App\UserRelation');
}

public function relatedUserRelations() {
    return $this->hasMany('App\UserRelation', 'related_user_id');
}

public function allUserRelations() {
    return $this->userRelations->merge($this->relatedUserRelations);
}

De cette façon, vous bénéficiez toujours d'un chargement et d'une mise en cache des relations sur le modèle.

$cause = Cause::with('donations.user.userRelations', 
        'donations.user.relatedUserRelations')
    ->where('active', 1)->first();

$userRelations = $cause->donations[0]->user->allUserRelations();
25
Collin James

Compoships ajoute le support des relations multi-colonnes dans Laravel 5's Eloquent.

Il vous permet de spécifier des relations à l'aide de la syntaxe suivante:

public function b()
{
    return $this->hasMany('B', ['key1', 'key2'], ['key1', 'key2']);
}

où les deux colonnes doivent correspondre.

8
topclaudy

Si quelqu'un a atterri ici comme moi à cause de google: comme ni merge () (comme suggéré ci-dessus) ni Push () (comme suggéré ici ) permettent un chargement rapide (et d'autres fonctionnalités de la relation Nice), la discussion est toujours en cours et a été poursuivi dans un fil plus récent, voir ici: Laravel Eloquent Inner Join on Self Referencing Table

J'ai proposé une solution , toutes autres idées et contributions sont les bienvenues.

0
tomstig