[英]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.