2

動的テーブル名を機能させるために何をする必要があるのか​​ わかりません。

次のモデルを検討してください (テーブル 'test' は存在しません):

<?php

// app/models/Test.php

class Test extends Eloquent {

}

そして、もしそうなら(「フィールド」テーブルは存在します):

<?php

// app/routes.php

$test = new \Test;
$test->setTable('fields');
$data = $test->find(1);
dd($data);

エラーが発生します:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.tests' doesn't exist (SQL: select * from `tests` where `id` = ? limit 1) (Bindings: array ( 0 => 1, ))"

Test モデルからのテーブル名の設定は問題なく機能することに注意してください。

L4 は実際には、vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations.Pivot.php コンストラクターで setTable() メソッドを使用しますが、それを機能させることはできませんでした。その例に従ってください。

手伝ってくれてありがとう。

4

3 に答える 3

7

おそらくこれは役に立ちます: http://laravel.io/forum/08-01-2014-defining-models-in-runtime

より正確には、ここから: http://laravel.io/forum/08-01-2014-defining-models-in-runtime?page=1#reply-11779

class ModelBuilder extends Eloquent {

    protected static $_table;


    public static function fromTable($table, $parms = Array()){
        $ret = null;
        if (class_exists($table)){
            $ret = new $table($parms);
        } else {
            $ret = new static($parms);
            $ret->setTable($table);
        }
        return $ret;
    }

    public function setTable($table)
    {
        static::$_table = $table;
    }

    public function getTable()
    {
        return static::$_table;
    }
}

$user = ModelBuilder::fromTable("users")->find(1);

これは最終的な実装ではありません。これは、私の使用例のために、それよりもはるかに複雑 (かつ汚い) です。しかし、この例はあなたが必要とするものにあなたを導くかもしれないと思います.

于 2014-08-03T04:40:11.603 に答える
0

Larvael の設計は、動的モデルを完全にはサポートしていません。setTable メソッドはありますが、その制限はインスタンス メソッドです。さらに、フレームワーク内では、多くのクエリが「新しい静的」を介してモデル インスタンスを作成することから始まるため、内部クエリでテーブルを設定する方法はありません。はい、独自のクエリで setTable を呼び出すことはできますが、SoftDeletes forceDelete などの Laravel の機能をさらに使用してアプリケーションを開発するにつれて、徐々にレンガの壁に直面することになります。回避策は、PHP の eval 関数を使用して実行時にモデル クラスを生成することです。これにより、new static は設計どおりに動作します。

    // load all the models
    $eval = "namespace App\\Records;";
    foreach($container->tables()->get() as $table){
        $recordType = $table->recordType;
        $recordTable = $table->getRecordTableName();
        $eval .= "class $recordType extends \\App\\Record { protected \$table = '$recordTable'; }";

    }
    eval($eval);

「会場」recordTable を使用する「会場」recordType がある場合、テーブル「会場」を使用するクラス \App\Records\Venue があるため、これを行うことができます。

$class = "\App\Records\Venue";
$venue = $class::find(1);

これで、ハッカーなしで設計どおりに Laravel を自由に使用できるようになりました。これはセキュリティ リスクを伴う非常に強力な回避策であるため、eval で使用されるすべてのパラメータを必ずサニタイズしてください。いつかLaravelが動的モデルをサポートする方法を実装することを願っています.

于 2015-07-10T13:19:18.513 に答える