我的大多数数据库表都使用数据库配置文件中设置的前缀,但我有几个静态的表,我用于查找状态,如国家,国家等。有没有办法在模型或elesewhere中告诉Laravel这些表不使用前缀现在我的播种机和其他功能不起作用,因为它们采用前缀。
我在模型中设置了这样的表名:
protected $table = 'states';
当然我可以让他们像所有其他表一样使用前缀或创建一个单独的数据库连接,但我想知道是否有另一种解决方案。
谢谢!
答案 0 :(得分:4)
我正在考虑为一个项目做这个,我遇到了这个帖子:
http://laravel.io/forum/03-20-2014-override-table-prefix-for-one-model
最后一条评论(至少目前为止)建议设置另一个使用备用(或否)前缀的数据库连接,然后告诉您要使用该连接的特定模型。
例如 在模型中:
protected $connection = 'db_no_prefix';
protected $table = 'this_table';
db config 中的
'connections' = > [
...
'db_no_prefix' => [
....
'prefix' => '',
],
],
答案 1 :(得分:3)
Laravel(或现有的任何软件)都不会神奇地知道哪些表格有前缀,哪些表格没有在某处定义。定义它的地方正是你所说的模型:
// State model
protected $table = 'states';
// Some other model
protected $table = 'pre_mytable';
如果你的模特都明确地定了他们的桌子,你的种子应该完美地运作。
现在,显然如果某个软件有一个在某处定义的数据库表列表,它可以迭代它们并确定哪些是前缀。但这最终会破坏目的,因为最初的意图是让你的软件找出哪些是前缀的,这样才能知道要访问的表名。
无论如何,在模型中明确定义表名是一种很好的做法。有一天,当你或其他人查看你的代码时,你可能想知道模型所指的是什么表,但是如果它被明确定义那么就没有办法混淆了。如果你想在一年后了解事情,就不要试图在应用程序上依赖过多的魔法。
答案 2 :(得分:-1)
我认为部分问题出在我的播种机上。我没有使用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');
}
}
但是,即使我解决了这个问题,我仍然可能在系统的其他部分出现问题。可能更容易使用前缀并在其他应用程序中创建表的副本。