Es posible tener una relación hasMany en dos columnas?

Mi tabla tiene dos columnas, user_id y related_user_id.

Quiero que mi relación para que coincida con cualquiera de las columnas.

En mi modelo tengo

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

Que se ejecuta la consulta: select * from user_relations where user_relations.user_id in ('17', '18').

La consulta que tengo que hacer es:

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

EDICIÓN:

Estoy usando con ganas de carga y creo que esto afectará la forma en que va a tener que trabajar.

$cause = Cause::with('donations.user.userRelations')->where('active', '=', 1)->first();
Tal vez es mejor acaba de filtrar el UserRelation modelo por dos columnas?

OriginalEl autor CharliePrynn | 2015-04-20

2 Comentarios

  1. 19

    Yo no creo que sea posible hacer exactamente lo que están pidiendo.

    Creo que se debe tratar por separado las relaciones y, a continuación, crear un nuevo método en el modelo para recuperar una colección de ambos.

    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);
    }

    Esta manera con el beneficio de ganas de carga y relación de almacenamiento en caché en el modelo.

    $cause = Cause::with('donations.user.userRelations', 
            'donations.user.relatedUserRelations')
        ->where('active', 1)->first();
    
    $userRelations = $cause->donations[0]->user->allUserRelations();
    Gracias, esta parece una buena forma de hacerlo.
    Por qué me sale esto? Llamada a método no Iluminar\\bases de datos\\de Consulta\\Builder::merge()
    Quitar los corchetes después userRelations @ciccioassenza 🙂
    Hmm notado que hice esa pregunta hace 3 años @developerbmw 🙂
    Sí me di cuenta, sin embargo, yo no podía resistirme a decírmelo 🙂 @ciccioassenza

    OriginalEl autor Collin James

  2. 4

    Compoships añade soporte para multi-columnas de relaciones en Laravel 5 Elocuente.

    Le permite especificar las relaciones con la siguiente sintaxis:

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

    donde ambas columnas tienen que coincidir.

    Formato de esto por favor
    ¿Compoships apoyo de relaciones donde todas las columnas tienen que coincidir o también lo que el propietario del tema que se piden, es decir, que sólo una de las dos columnas de los partidos? No es muy clara a partir de su descripción.
    El usuario se preguntó «¿Es posible tener una relación hasMany en dos columnas?» – No. Con la configuración predeterminada del Laravel la instalación. Sí, mediante el uso de Compoships. Para responder a tu pregunta, todas las columnas tienen que coincidir.
    En este caso su respuesta realmente no proporciona una solución a su problema. El autor quiere que su relation to match either of the columns, no tanto. Todavía puede ser útil para otros usuarios, aunque. Tal vez usted sólo debe clearify en su respuesta que se tiene para que coincida con todas las columnas para el trabajo.
    Fijo!

    OriginalEl autor topclaudy

Dejar respuesta

Please enter your comment!
Please enter your name here