42

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

4

15 に答える 15

91

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

于 2013-12-28T07:55:27.287 に答える
58

テイラーはあなたの質問に対する答えを持っています:

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

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

すべてのモデルにテーブル名を静的に返す機能を持たせたい場合は、次のようにします。

class BaseModel extends Eloquent {

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

}

class User extends BaseModel {

}


User::getTableName();
于 2014-06-29T16:23:22.257 に答える
21

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());
});
于 2012-12-29T14:45:20.530 に答える
12

私の場合、laravel5.4を使用しています

return (new static)->getTable();

于 2018-01-10T10:07:37.693 に答える
6

はModelクラス(Laravel> = 5)の保護されたプロパティであるためtable、Modelのインスタンスが必要になります。

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

        DB::table( (new YourModelClassname)->getTable() )
            ->update(['field' => false]);
于 2015-08-11T15:16:42.350 に答える
5

次のコードでモデルのテーブルの名前を取得できます。

ModelNameとしてモデルがある場合:

ModelName::query()->getQuery()->from

protected $table = 'custom_table_name'このメソッドは、モデルで定義されているカスタムテーブル名の場合にも正常に機能します。

于 2020-06-30T09:31:56.853 に答える
3

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クラス内に新しい関数を作成しますが、オブジェクトから関数を呼び出す必要があります。

于 2020-02-05T07:38:12.423 に答える
2

これによりLaravelモデルからテーブル名を取得する簡単な方法:

$tableName = app(\App\User::class)->getTable();

交換することを忘れないでください:

\ App \ User

モデルパスあり。

于 2020-09-03T09:10:29.887 に答える
1

オトウェルの答えに基づいて、次のようなものを使用できます。

with(new Model)->getTable();

注:バージョン5.x、6.x、7.x、8.xでテストされており、正常に動作します。

于 2020-10-17T18:03:57.320 に答える
1

別の解決策は、次のresolveようなヘルパーを使用することです。

resolve('\\App\\Models\\User')->getTable()
于 2021-03-16T12:10:38.263 に答える
1

モデルのテーブル名を静的に取得できるようにする別のアプローチを次に示します。

  1. 特性を定義する:app/Traits/CanGetTableNameStatically.php
<?php namespace App\Traits;

trait CanGetTableNameStatically
{
    public static function tableName()
    {
        return (new static)->getTable();
    }
}
  1. 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のおかげでもちろん引用してここに貼り付けてコピーしました

于 2021-08-04T09:40:25.173 に答える
1

モデルからテーブル名を返します。Laravel8で完璧に動作しました

app(Modelname::class)->getTable()

Modelnameをモデルクラスに置き換える必要があります

于 2021-10-28T07:22:57.883 に答える
0

テーブル名プレフィックスを使用している場合、これまでの回答では、プレフィックス付きのテーブル名は取得されません。現時点では、データベーステーブルの実際の名前が必要な場合は、プレフィックスをテーブル名と連結する必要があるようです。

テーブルプレフィックスを含むテーブル名を取得する方法は次のとおりです。

echo \App\MyModel::query()->getQuery()->getGrammar()->getTablePrefix() . app(\App\MyModel::class)->getTable();
于 2021-09-24T08:57:34.857 に答える
-3

私は検索エンジンから来る人々のために以下を追加したかっただけです:

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

$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テーブルがあるなど)

于 2019-08-22T21:20:13.000 に答える
-4

Laravel4では静的メソッドを使用します

$table_name = Model::getTable();

またはEloquentモデル内の「自己」

$table_name = self::getTable();
于 2014-03-09T18:40:04.983 に答える