Mysql
 sql >> Database >  >> RDS >> Mysql

Distant Has Many Through

Non credo che ci sia un tale metodo in Laravel. Devi creare la tua query personalizzata. Questa query personalizzata può essere molto costosa poiché verranno eseguite più query. Pertanto, la soluzione ottimale per questo, secondo me, è mettere in relazione Utente e Opportunità con una chiave esterna.

Tuttavia, se non desideri collegare Utente e Opportunità con una chiave esterna, puoi creare una query personalizzata per gestirlo. Aggiungi semplicemente una relazione "hasManyThrough" tra Opportunità e modello Cliente come,

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

Quindi crea una funzione statica in Modello utente.

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

Ora puoi accedere a Opportunity realed a un utente in una volta sola come,

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

Ciò restituirà tutte le opportunità di tutti i clienti relativi all'utente con ID '1'.