Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Distant Has ManyThrough


Eu não acho que exista esse método no Laravel. Você precisa criar sua consulta personalizada. Essa consulta personalizada pode ser muito cara, pois várias consultas serão executadas. Assim, a solução ótima para isso, segundo mim, é relacionar Usuário e Oportunidade com uma chave estrangeira.

No entanto, se você não desejar vincular Usuário e Oportunidade a uma chave estrangeira, poderá criar uma consulta personalizada para lidar com isso. Basta adicionar uma relação "hasManyThrough" entre o modelo de oportunidade e 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');
        }
    }

Em seguida, crie uma função estática no modelo User.
    <?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;
        }
    }

Agora você pode acessar a oportunidade de um usuário de uma só vez como,
    Route::get('/', function()
    {   
         return $usersOpportunities = User::getOpportunityOfUser(1);
    });

Isso retornará todas as oportunidades de todos os clientes relacionados ao usuário com id '1'.