Model Laravel 4:使用setTable()的动态表名

Model Laravel 4:使用setTable()的动态表名,model,laravel,eloquent,Model,Laravel,Eloquent,我不确定需要做什么才能使动态表名正常工作 考虑以下模型(表“测试”不存在): 请注意,从测试模型设置表名效果很好 L4实际上在vendor/laravel/framework/src/illumb/Database/elount/Relations.Pivot.php构造函数中使用了setTable()方法,这与我希望的方式非常相似,尽管我无法按照该示例使其工作 谢谢你的帮助。也许这对你有用: 更确切地说,从这里开始: 这不是我的最终实现,因为我的用例,它比那个要复杂得多(而且更脏)。但我想这个

我不确定需要做什么才能使动态表名正常工作

考虑以下模型(表“测试”不存在):

请注意,从测试模型设置表名效果很好

L4实际上在vendor/laravel/framework/src/illumb/Database/elount/Relations.Pivot.php构造函数中使用了setTable()方法,这与我希望的方式非常相似,尽管我无法按照该示例使其工作


谢谢你的帮助。

也许这对你有用:

更确切地说,从这里开始:


这不是我的最终实现,因为我的用例,它比那个要复杂得多(而且更脏)。但我想这个例子可能会引导你找到你需要的东西

您需要覆盖雄辩模型的静态
find
方法,因为它用于查找:

public static function find($id, $columns = array('*'))
{
    if (is_array($id) && empty($id)) return new Collection;

    $instance = new static;

    return $instance->newQuery()->find($id, $columns);
}
该方法是创建模型类的新实例,而不是重用灌输的类。默认情况下,这会“忘记”已设置的表。可能您需要为它传递表名。在我的用例中,我的代码根据
id
推断使用的表,因此我不必传递整个表名。遗产万岁;-)

另一种选择是使用一些额外的工厂类,如Daniel Cantarin


您可能需要重写一些额外的静态方法来处理所有用例。例如,我刚刚注意到使用渴望加载会破坏我的表mods,因此我需要复制
方法的行为,而不破坏它调用的API,yay-\uuuuuuuuuu-

幼虫的设计并不完全支持动态模型。尽管存在可设置方法,但其局限性在于它是一个实例方法。此外,在框架内,许多查询都是从通过“newstatic”创建模型实例开始的,因此您无法在内部查询上设置表。是的,您可以在自己的查询中调用setTable,但随着您使用Laravel的更多功能开发更多应用程序,例如SoftDeletes forceDelete,您将逐渐遇到困难。一种解决方法是使用PHP的eval函数在运行时生成模型类,这样新的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);
如果我有一个使用“场馆”记录表的“场馆”记录类型,我现在有一个使用“场馆”表的class\App\Records\vention,因此我现在可以这样做了

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

现在,您可以自由使用Laravel,而无需任何黑客攻击。这是一个非常强大的解决方案,会带来安全风险,因此请确保清除eval中使用的任何参数。希望有一天Laravel会实现一种支持动态模型的方法。

您使用Laravel 3吗?您找到解决方案了吗?
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);
public static function find($id, $columns = array('*'))
{
    if (is_array($id) && empty($id)) return new Collection;

    $instance = new static;

    return $instance->newQuery()->find($id, $columns);
}
    // 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);
$class = "\App\Records\Venue";
$venue = $class::find(1);