Mysql
 sql >> Base de données >  >> RDS >> Mysql

Distant HasManyThrough

Je ne pense pas qu'il existe une telle méthode dans Laravel. Vous devez créer votre requête personnalisée. Cette requête personnalisée peut être très coûteuse car plusieurs requêtes seront effectuées. Ainsi, la solution optimale pour cela, selon moi, est de relier User et Opportunity avec une clé étrangère.

Toutefois, si vous ne souhaitez pas lier l'utilisateur et l'opportunité à une clé étrangère, vous pouvez créer une requête personnalisée pour gérer cela. Ajoutez simplement une relation "hasManyThrough" entre l'opportunité et le modèle client comme,

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

Créez ensuite une fonction statique dans le modèle utilisateur.

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

Vous pouvez maintenant accéder à l'opportunité liée à un utilisateur en une seule fois comme,

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

Cela renverra toutes les opportunités de tous les clients liés à l'utilisateur avec l'identifiant '1'.