Laravel Extends Model hasManyThrough 3 parameters

Dans le cas de figure où nous avons besoin de modifier la clé par défaut ‘id’ pour une relation HasManyThrough exemple ci-dessous , Laravel ne le permet pas.

 

public function annonces()
    {
        return $this->hasManyThrough('App\Annonces', 'App\User_Profile','country_id','user_id','user_id');
    }

Pour un client, j’ai eu besoin d’utiliser une autre clé pour la table de liaison qui est en 2ème paramètres.

Au lieu d’hériter la classe model de Model, j’ai créé une autre classe Dmodel < Model

 

class Dmodel extends Model{

    public function hasManyThrough($related, $through, $firstKey = null, $secondKey = null, $thirdKey = null)
    {
        $through = new $through;

        $firstKey = $firstKey ?: $this->getForeignKey();
        $secondKey = $secondKey ?: $through->getForeignKey();

        return new DHasManyThrough((new $related)->newQuery(), $this, $through, $firstKey, $secondKey,$thirdKey);
    }
}

Et aussi

class DHasManyThrough extends HasManyThrough{

    protected $thirdkey;

    public function __construct(Builder $query, $farParent, $parent, $firstKey, $secondKey, $thirdKey)
    {
        $this->firstKey = $firstKey;
        $this->secondKey = $secondKey;
        $this->thirdkey = $thirdKey;
        $this->farParent = $farParent;

        parent::__construct($query, $farParent, $parent, $firstKey, $secondKey);
    }

    protected function setJoin(Builder $query = null)
    {

        $query = $query ?: $this->query;
        $foreignKey = $this->related->getTable().'.'.$this->secondKey;
        if($this->thirdkey == null)
            $query->join($this->parent->getTable(), $this->getQualifiedParentKeyName(), '=', $foreignKey);
        else{
            $join = $this->parent->getTable().".".$this->thirdkey;
            $query->join($this->parent->getTable(),$join, '=', $foreignKey);
        }
        if ($this->parentSoftDeletes())
        {
            $query->whereNull($this->parent->getQualifiedDeletedAtColumn());
        }
    }
}

Pour écraser setJoin afin de placer mon 3ème paramètre.