Php 使用Laravel 4自动生成模型类(即使用L4的现有数据库)
我在MySQL Workbench中设计了我的数据库,并设置了所有外键,等等 我想在Laravel4中使用这个DB模式,但是从文档中看,没有任何一个词能够处理现有的一组数据库表。据我所知,其他框架(如带有“烘焙”功能的Cake)允许您根据数据库中已有的表自动生成模型类 我到处都找过了,对于拉威尔4号,我根本看不到这方面的任何东西。我发现的最接近的东西是Jeffrey Way的artisan生成器包,但是这只创建了基础模型,并没有检测到已建立的外键关系Php 使用Laravel 4自动生成模型类(即使用L4的现有数据库),php,laravel,eloquent,Php,Laravel,Eloquent,我在MySQL Workbench中设计了我的数据库,并设置了所有外键,等等 我想在Laravel4中使用这个DB模式,但是从文档中看,没有任何一个词能够处理现有的一组数据库表。据我所知,其他框架(如带有“烘焙”功能的Cake)允许您根据数据库中已有的表自动生成模型类 我到处都找过了,对于拉威尔4号,我根本看不到这方面的任何东西。我发现的最接近的东西是Jeffrey Way的artisan生成器包,但是这只创建了基础模型,并没有检测到已建立的外键关系 对于Laravel 4,这是可能的,还是我必
对于Laravel 4,这是可能的,还是我必须手动完成所有工作?cakePHP在从已经存在的DB模式充实整个项目方面做得很好。Laravel目前不支持类似的操作。还有一个小特点仍然阻碍着我采用拉威尔。好消息是安东尼奥刚刚完成了他的 这是一个很好的解决方案,但对我来说有点晚了,但可能对你有很大帮助 更新:该链接目前不起作用。wabpage说:“我们正在重新设计,很快就会回来!”。我给安东尼奥发了一封电子邮件,问他这项服务什么时候能恢复
安东尼奥说它会回来的,但没有预计到达时间。我们必须等待。嗯,我也有同样的问题,我自己写了一个小脚本,生成基类并解决外键问题。这是一个基本的解决方案,只确定“hasOne”关系,以后可能需要将其更改为hasMany。我使用控制器并在视图中构建代码模板: 控制器:
namespace Admin;
/**
* just a quick helper to generate model classes
* from mysql to Eloquent style ones..
* @author Mario
*/
class ModelController extends \BaseController {
/**
* save Classes in folder of choice
*
* @return void
*/
public function create($folder)
{
$sql = "SELECT * FROM information_schema.tables WHERE table_schema = 'UR_SCHEMA'";
$tables = \DB::select($sql);
$sql2 = "select * from information_schema.`KEY_COLUMN_USAGE` where constraint_schema = 'UR_SCHEMA' order by table_name";
$keys = \DB::select($sql2);
$meta = $this->sortOutMetadata($keys);
foreach ($tables as $table) {
$metaData = null;
if(!empty($meta[$table->TABLE_NAME])){
$metaData = $meta[$table->TABLE_NAME];
}
$code = \View::make('model.start', array('table' => $table, 'meta' => $metaData))->render();
file_put_contents($folder.DIRECTORY_SEPARATOR.ucfirst(camel_case($table->TABLE_NAME).'.php'), $code);
}
}
/**
* provide structure indexed by table
*
* @param type $keys
* @return type
*/
private function sortOutMetadata($keys)
{
$return = array();
foreach ($keys as $key) {
if ($key->CONSTRAINT_NAME == 'PRIMARY') {
$return[$key->TABLE_NAME]['pk'] = $key->COLUMN_NAME;
} elseif (!empty($key->REFERENCED_TABLE_NAME)) {
//one way
$return[$key->TABLE_NAME]['fk'][] = array('column' => $key->COLUMN_NAME,
'refColumn' => $key->REFERENCED_COLUMN_NAME,
'refTable' => $key->REFERENCED_TABLE_NAME,);
//and the other
$return[$key->REFERENCED_TABLE_NAME]['fk'][] = array('column' => $key->REFERENCED_COLUMN_NAME,
'refColumn' => $key->COLUMN_NAME,
'refTable' => $key->TABLE_NAME,);
}
}
return $return;
}
}
我的视图模板(相当于我的类模板)
这给了我一些体面的方法,让我的基类自动生成我需要的方式。请记住,您必须能够与db用户一起查看信息
希望这有帮助不客气;)Antonio甚至承诺下一个版本将能够通过生成种子导入数据。我目前正在处理请求的最常见功能(如使用InnoDB/MyIsam表、软删除实现、注释级指令等)。预计在几个月内会有一个更新和一个完整的站点大修。嘿,听到这个消息太好了。您的转换器很受欢迎,正是我们在圣诞节愿望清单上所做的;)您链接到的站点不幸已死亡。有人知道在哪里可以找到这个项目吗?那个网站已经离线将近一年了。这不是公认的答案!本机迁移数据和DB模式确实是一大优势。
<?php echo '<?php'; ?>
namespace Model\Base;
use Model\Model;
class <?php echo ucfirst(camel_case($table->TABLE_NAME));?> extends Model {
/**
* @var String
*/
protected $table = '<?php echo $table->TABLE_NAME;?>';
<?php if (isset($meta['pk'])):?>
/**
* @var String
*/
protected $primaryKey = '<?php echo $meta['pk'];?>';
/**
* attributes not writable from outside
* @var mixed
*/
protected $guarded = array('<?php echo $meta['pk'];?>');
<?php endif;?>
/**
* Timestamps we dont want here
* @var Boolean
*/
public $timestamps = false;
<?php if (isset($meta['fk'])):?>
<?php foreach($meta['fk'] as $keys):?>
/**
* @return HasOne
*/
public function <?php echo camel_case($keys['refTable']);?>()
{
return $this->hasOne('Model\<?php echo ucfirst(camel_case($keys['refTable']));?>', '<?php echo $keys['refColumn'];?>', '<?php echo $keys['column'];?>');
}
<?php endforeach;?>
<?php endif;?>
}
$controller = new \Admin\ModelController();
$controller->create(__DIR__ . DIRECTORY_SEPARATOR . 'tmpModel');