繁体   English   中英

Laravel 4-是否可以为某些表添加前缀,而对其他表则没有?

[英]Laravel 4 - is there a way to have a prefix for some tables, but not others?

我的大多数数据库表都使用数据库配置文件中的前缀集,但是我有几个静态表用于状态,国家(地区)等查询。有没有办法在模型或其他地方告诉Laravel这些表不要使用前缀现在,我的播种机和其他功能由于使用前缀而无法使用。

我在这样的模型中设置了表名:

protected $table = 'states';

当然,我可以像其他所有表一样使它们使用前缀,也可以创建单独的数据库连接,但是我想知道是否还有其他解决方案。

谢谢!

我也在考虑为一个项目这样做,我遇到了这个话题:

http://laravel.io/forum/03-20-2014-override-table-prefix-for-one-model

最后一条评论(至少到目前为止)建议建立另一个使用备用(或不使用)前缀的数据库连接,然后告诉您要使用该连接的特定模型。

例如在模型中:

protected $connection = 'db_no_prefix';    
protected $table = 'this_table';   

在数据库配置中

'connections' = > [
    ...
    'db_no_prefix' => [
        ....
        'prefix' => '', 
    ],
],

如果您未在某些地方定义前缀,Laravel(或任何现有软件)将无法神奇地知道哪个表具有前缀,而哪些则没有。 定义的位置正是您在模型中所说的位置:

// State model
protected $table = 'states';

// Some other model
protected $table = 'pre_mytable';

如果所有模型都明确定义了表,则种子应该可以正常工作。

现在,很显然,如果某个软件在某个地方定义了一个数据库表列表,它就可以遍历它们并确定哪些是前缀的。 但这最终违背了此目的,因为最初的意图是让您的软件确定哪些是前缀的,以便它可以知道要访问的表名。

无论如何,在模型中显式定义表名是一个好习惯。 在某天,当您或其他人查看您的代码时,您可能想知道模型所引用的表,但是如果定义明确,则没有办法混淆。 如果您想在一年后了解事物,切勿尝试在应用程序上依赖过多的魔术。

我认为部分问题出在我的播种机中。 我没有使用Schema类来创建表,但是在删除时正在使用它。

class CreateStatesTable extends Migration {

    public function up()
    {
        DB::statement("
            CREATE TABLE IF NOT EXISTS `".Config::get('database.connections.mysql.prefix')."_states` (
              `state_id` tinyint(2) NOT NULL AUTO_INCREMENT,
              `state_name` varchar(15) NOT NULL DEFAULT '',
              `state_abbr` char(2) NOT NULL DEFAULT '',
              PRIMARY KEY (`state_id`)
            ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=52 ;
        ");
    }

    public function down()
    {
        Schema::drop('states');
    }
}

但是,即使我解决了这个问题,在系统的其他部分仍然可能出现问题。 仅使用前缀并在其他应用程序中创建表的副本可能会更容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM