web-dev-qa-db-fra.com

Comment retourner le nom de la table de base de données dans Laravel

Existe-t-il un moyen d'obtenir la table de base de données actuelle utilisée par le modèle dans lequel je suis? Je vois qu'il y a une fonction table () dans Laravel/Database/Eloquent/model.php mais je n'ai pas réussi à l'appeler en l'appelant depuis le modèle dans lequel je suis.

18
Chris G

Modifier avril 2019: cette réponse est désormais obsolète. Voir la nouvelle bonne réponse de Flyn San

Oui - Eloquent a un $table variable. Il y a deux façons d'y accéder:

class yourModel extends Eloquent {

        public static $table = "differentTable";

        function someFunction()
        {
             return yourModel::$table;
        }
}

o

class yourModel extends Eloquent {

    public function someFunction()
    {
        return $this->table();

    }
}

puis dans votre code

Route::get('/', function () {
    $model = new yourModel();   
    dd($model->someFunction());
});
10
Laurence

Taylor a un réponse à votre question:

Dans la classe modèle, vous pouvez faire quelque chose comme ceci:

return with(new static)->getTable();

Si vous voulez que tous vos modèles aient la possibilité de renvoyer le nom de la table statiquement, alors quelque chose comme ceci:

class BaseModel extends Eloquent {

    public static function getTableName()
    {
        return with(new static)->getTable();
    }

}

class User extends BaseModel {

}


User::getTableName();
42
Lucky Soni

Il existe une méthode publique getTable () définie dans Eloquent\Model , vous devriez donc être en mesure d'utiliser $model->getTable().

39
Flyn San

Dans mon cas, j'utilise laravel 5.4

return (new static)->getTable();

5
sh6210

Puisque table est une propriété protégée dans la classe Model (Laravel> = 5), vous aurez besoin d'une instance de votre Model.

Voici un exemple de cas:

        DB::table( (new YourModelClassname)->getTable() )
            ->update(['field' => false]);
2
Lorenz Lo Sauer

Je voulais juste ajouter ce qui suit pour les personnes provenant des moteurs de recherche:

Dans le cas où vous ne souhaitez même pas instancier le modèle (plus rapidement?):

$model = 'App\User';
$modelTable = str_replace('\\', '', Str::snake(Str::plural(class_basename($model))));
dd($modelTable); // will return "users"

Cela peut sembler laid, mais c'est exactement ainsi que la méthode getTable () le résout sous le capot, alors ...

Tu devras use Illuminate\Support\Str; en haut de votre fichier.

Addendum: impliquant que vous suivez les normes du framework (par exemple: Post le modèle a posts table, le modèle utilisateur a users table, etc.)

0
13h50