Bonjour à tous,

Voici une petite astuce pour forcer Eloquent (ou MEloquent pour MongoDB) d'utiliser une table ou une collection sur tout un model de manière transparente, facultative et dynamique.

Je n'ai trouvé cette astuce sur aucun forum, jusque là. Je partage donc ma trouvaille ici.

Très utile pour la gestion d'un multi-site et éviter de renseigner à chaque requête quelle table ou connection utiliser. Et surtout, très simple à mettre en place !

Avant de commencer, il faut savoir que chaque requête sur un model va créer une nouvelle instance de la class même si l'appel est static. Ainsi :

User::find(42);

Va créer une nouvelle instance de User et appeler la méthode "find".

// vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
public static function __callStatic($method, $parameters)
{
    $instance = new static;
    return call_user_func_array(array($instance, $method), $parameters);
}

Par conséquent, chaque requête va appeler le constructeur du model.

Ainsi, il nous suffit de modifier la propriété $this->table dans le constructeur du model pour appliquer la modification à toutes les requêtes !

class User extends Eloquent implements UserInterface {
    public $table = 'users';
    // ou pour mongodb :
    // public $collection = 'users';

    public function __construct(array $attributes = array())
    {
        $this->table = ... // Ici votre code pour modifier le nom de la table avec vos conditions
        // Changez $this->collection pour Mongodb
        parent::__construct($attributes);
    }
}

Tout simplement !

Par contre, l'astuce ne fonctionne pas pour les requêtes via la facade DB. Vous pouvez toutefois créer une fonction pour retourner le nom de la table à utiliser.

Aucune réponse