흠 나는 동일한 문제가 있었고 기본 클래스를 생성하고 외래 키 문제를 해결하는 작은 스크립트를 직접 작성했습니다. 이것은 기본 솔루션이며 "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;
}
}
내보기 템플릿 (꽤 많이 내 클래스 템플릿)
<?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');
이것은 내가 필요한 방식으로 자동 생성 된 기본 클래스를 얻을 수있는 적절한 방법을 제공합니다. db 사용자와 함께 information_schema 스키마를 볼 수 있어야한다는 것을 기억하십시오.
희망이 있습니다.
매력처럼 작동합니다 - 훌륭한 도구. 대단히 감사합니다! – Sk446
당신은 환영합니다;) Antonio는 심지어 다음 버전이 씨앗을 생성하여 데이터를 가져올 수 있다고 약속했습니다. – Hexodus
안녕하세요 @Hexodus, 게시 해 주셔서 감사합니다. 나는 현재 가장 일반적인 기능 (InnoDB/MyIsam 테이블 사용, 소프트 삭제 구현, 주석 레벨 지시문 등)을 요청하고있다.2 개월 내에 업데이트 및 전체 사이트 점검을 기대하십시오. –