web-dev-qa-db-ja.com

Laravelでデータベーステーブル名を返す方法

私がいるモデルで使用中の現在のデータベーステーブルを取得する方法はありますか? Laravel/Database/Eloquent/model.phpにtable()関数があることがわかりましたが、自分がいるモデルからそれを呼び出して呼び出すことに失敗しました。

18
Chris G

2019年4月編集:この回答は現在古くなっています。FlynSanによる新しい正解をご覧ください

はい-Eloquentには$table変数。これにアクセスするには2つの方法があります。

class yourModel extends Eloquent {

        public static $table = "differentTable";

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

または

class yourModel extends Eloquent {

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

    }
}

あなたのコードで

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

テイラーには、質問に対する answer があります。

モデルクラス内では、次のようなことができます。

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

すべてのモデルにテーブル名を静的に返す機能が必要な場合は、次のようにします。

class BaseModel extends Eloquent {

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

}

class User extends BaseModel {

}


User::getTableName();
42
Lucky Soni

Eloquent\Model で定義されているパブリックgetTable()メソッドがあるので、$model->getTable()を使用できるはずです。

39
Flyn San

私の場合、laravel 5.4

return (new static)->getTable();

5
sh6210

tableはModelクラス(Laravel> = 5)の保護されたプロパティなので、モデルのインスタンスが必要です。

ケースの例を次に示します。

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

検索エンジンから来ている人のために、次を追加したかっただけです。

モデルをまったくインスタンス化したくない場合(より高速ですか?):

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

それはmightいように見えるかもしれませんが、それはまさにgetTable()メソッドが内部でそれを解決する方法です。

ファイルの上にuse Illuminate\Support\Str;する必要があります。

補遺:フレームワークの標準に従うことを意味します(つまり、Postモデルにはpostsテーブルがあり、ユーザーモデルにはusersテーブルなどがあります)

0
13h50