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.
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());
});
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();
Il existe une méthode publique getTable () définie dans Eloquent\Model , vous devriez donc être en mesure d'utiliser $model->getTable()
.
Dans mon cas, j'utilise laravel 5.4
return (new static)->getTable();
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]);
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.)