現在のデータベーステーブルを現在のモデルで使用している状態にする方法はありますか?Laravel / Database / Eloquent / model.phpにtable()関数があるようですが、自分がいるモデルから呼び出すことに失敗しました。
15 に答える
Eloquent \ Modelに定義されたパブリックgetTable()メソッドがあるため、を使用できるはずです$model->getTable()
。
テイラーはあなたの質問に対する答えを持っています:
モデルクラス内では、次のようなことができます。
return with(new static)->getTable();
すべてのモデルにテーブル名を静的に返す機能を持たせたい場合は、次のようにします。
class BaseModel extends Eloquent {
public static function getTableName()
{
return with(new static)->getTable();
}
}
class User extends BaseModel {
}
User::getTableName();
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());
});
私の場合、laravel5.4を使用しています
return (new static)->getTable();
はModelクラス(Laravel> = 5)の保護されたプロパティであるためtable
、Modelのインスタンスが必要になります。
ケースの例を次に示します。
DB::table( (new YourModelClassname)->getTable() )
->update(['field' => false]);
次のコードでモデルのテーブルの名前を取得できます。
ModelNameとしてモデルがある場合:
ModelName::query()->getQuery()->from
protected $table = 'custom_table_name'
このメソッドは、モデルで定義されているカスタムテーブル名の場合にも正常に機能します。
Lucky Soniの回答に基づいて、 VontrollerまたはViewから直接呼び出したい場合は、もう1つの簡単なトリックがあります。
Laravel 6でテストされており、余分な行インスタンスの宣言が嫌いな「One Line Programmer」の場合は、引き続き使用します。モデルファイルにも余分な行は必要ありません。
$string_table_name = with(new \App\Model\TableModelName)->getTable();
またはそれ以上に、これを呼び出すこともできるかもしれません
$string_table_name = (new \App\Model\TableModelName)->getTable();
$table
モデルクラス内で変数の名前を変更しても、テーブル名のプレーンな文字列が返されます。
編集 :
マイナス担当者?? たぶん、テーブル名を取得するためだけにモデルクラスで新しい関数を作成する代わりに、コントローラーで最初にこれを試して、呼び出すときにオブジェクトを宣言する必要はありません。
with()
それ自体は、クラスのオブジェクトを返すLaravelヘルパー関数です。Modelを拡張するクラス内には、すでに関数がありますgetTable()
。したがって、モデルクラス内に別の新しい冗長関数を配置する必要はありません。最新バージョンのようですが、関数(new Class)
なしで呼び出すことができwith()
ます。
この答えとラッキーの答えの違いは、モデルクラスのオブジェクトを宣言せずに、コントローラーとビュー内で関数を呼び出すことができる場合でも、モデルクラス内にテーブル名を取得するための新しい関数を作成しないことです。コードを美しくするためです。
ラッキーの答えはModelクラス内に新しい関数を作成しますが、オブジェクトから関数を呼び出す必要があります。
これによりLaravelモデルからテーブル名を取得する簡単な方法:
$tableName = app(\App\User::class)->getTable();
交換することを忘れないでください:
\ App \ User
モデルパスあり。
オトウェルの答えに基づいて、次のようなものを使用できます。
with(new Model)->getTable();
注:バージョン5.x、6.x、7.x、8.xでテストされており、正常に動作します。
別の解決策は、次のresolve
ようなヘルパーを使用することです。
resolve('\\App\\Models\\User')->getTable()
モデルのテーブル名を静的に取得できるようにする別のアプローチを次に示します。
- 特性を定義する:
app/Traits/CanGetTableNameStatically.php
<?php namespace App\Traits;
trait CanGetTableNameStatically
{
public static function tableName()
{
return (new static)->getTable();
}
}
Model
必要なまたはステートメントBaseModel
を使用して拡張します。use
app/Models/BaseModel.php
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Traits\CanGetTableNameStatically;
class BaseModel extends Model
{
use CanGetTableNameStatically;
// ...
}
モデルでは、Laravelの予約済み属性にカスタムテーブル名を設定するprotected $table
と、それでも機能し、正しいテーブル名が返されます。
app/Models/Customer.php
<?php namespace App\Models\Master;
use App\Models\BaseModel;
class Customer extends BaseModel
{
protected $table = 'my_customers';
// ...
}
使用法YourModel::tableName()
:どこにでも電話するだけです。
ビュー内:
{{ \App\Models\Customer::tableName() }}
結合を行う場合:
DB::table( Product::tableName() . ' AS p' )
->leftJoin( ProductCategory::tableName() . ' AS pc', 'pc.id', '=', 'p.category_id')
// ... etc
注:私は必要に応じてこのアプローチを使用しますが、完全に開示します。まったく同じアプローチを持つ別の回答をここで見つけたので、 @topherのおかげでもちろん引用してここに貼り付けてコピーしました
モデルからテーブル名を返します。Laravel8で完璧に動作しました
app(Modelname::class)->getTable()
Modelnameをモデルクラスに置き換える必要があります
テーブル名プレフィックスを使用している場合、これまでの回答では、プレフィックス付きのテーブル名は取得されません。現時点では、データベーステーブルの実際の名前が必要な場合は、プレフィックスをテーブル名と連結する必要があるようです。
テーブルプレフィックスを含むテーブル名を取得する方法は次のとおりです。
echo \App\MyModel::query()->getQuery()->getGrammar()->getTablePrefix() . app(\App\MyModel::class)->getTable();
私は検索エンジンから来る人々のために以下を追加したかっただけです:
モデルをまったくインスタンス化したくない場合(より速く?):
$model = 'App\User';
$modelTable = str_replace('\\', '', Str::snake(Str::plural(class_basename($model))));
dd($modelTable); // will return "users"
それは見苦しいように見えるかもしれませんが、それはまさにgetTable()メソッドが内部でそれを解決する方法です。
use Illuminate\Support\Str;
ファイルの上に置く必要があります。
補遺:フレームワークの標準に従っていることを意味します(つまり、Post
モデルにposts
テーブルがある、ユーザーモデルにusers
テーブルがあるなど)
Laravel4では静的メソッドを使用します
$table_name = Model::getTable();
またはEloquentモデル内の「自己」
$table_name = self::getTable();