私がいるモデルで使用中の現在のデータベーステーブルを取得する方法はありますか? Laravel/Database/Eloquent/model.phpにtable()関数があることがわかりましたが、自分がいるモデルからそれを呼び出して呼び出すことに失敗しました。
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());
});
テイラーには、質問に対する 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();
Eloquent\Model で定義されているパブリックgetTable()メソッドがあるので、$model->getTable()
を使用できるはずです。
私の場合、laravel 5.4
return (new static)->getTable();
table
はModelクラス(Laravel> = 5)の保護されたプロパティなので、モデルのインスタンスが必要です。
ケースの例を次に示します。
DB::table( (new YourModelClassname)->getTable() )
->update(['field' => false]);
検索エンジンから来ている人のために、次を追加したかっただけです。
モデルをまったくインスタンス化したくない場合(より高速ですか?):
$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
テーブルなどがあります)