sql >> Base de Datos >  >> RDS >> Mysql

Distante HasManyThrough

No creo que exista tal método en Laravel. Tienes que crear tu consulta personalizada. Esta consulta personalizada puede ser muy costosa ya que se realizarán múltiples consultas. Por lo tanto, la solución óptima para esto, según yo, es relacionar Usuario y Oportunidad con una clave externa.

Sin embargo, si no desea vincular Usuario y Oportunidad con una clave externa, puede crear una consulta personalizada para manejar esto. Simplemente agregue una relación "hasManyThrough" entre la oportunidad y el modelo de cliente como,

    <?php
    class Client extends Eloquent{
        public function store(){
            return $this->hasMany('Store');
        }
        public function user(){
            return $this->belongsTo('User');
        }

        public function opportunity(){
            return $this->hasManyThrough('Opportunity', 'Store');
        }
    }

Luego crea una función estática en el modelo de Usuario.

    <?php

    class User extends Eloquent implements UserInterface, RemindableInterface {

        use UserTrait, RemindableTrait;

        public function client(){
            return $this->hasMany('Client');
        }
        public function store(){
            return $this->hasManyThrough('Store', 'Client');
        }

        public static function getOpportunityOfUser($userId)
        {
             $clients = User::find($userId)->client;

            foreach ($clients as $client) {
                $opportunities[] = Client::find($client->id)->opportunity;
            }

            return $opportunities;
        }
    }

Ahora puede acceder a la oportunidad relacionada con un usuario de una sola vez como,

    Route::get('/', function()
    {   
         return $usersOpportunities = User::getOpportunityOfUser(1);
    });

Esto devolverá todas las oportunidades de todos los clientes relacionados con el Usuario con id '1'.